django - 如何检查表单的干净方法,无论是插入还是更新

Tho*_*mel 7 django-forms

我有一个表单,我在clean方法中验证ProjectMembership对象是否已经存在,具有相同的项目和成员值.这是因为我在ProjectMembership模型中为项目和成员定义了unique_together约束.这实际上很好.

class ProjectMembershipForm(forms.ModelForm):

    project = forms.ModelChoiceField(Project.objects, widget=HiddenInput())

    class Meta:
        model = ProjectMembership

    def clean(self):
        cleaned_data = self.cleaned_data

        project = cleaned_data.get("project")
        member = cleaned_data.get("member")

        print ProjectMembership.objects.filter(project=project, member=member).count()
        if ProjectMembership.objects.filter(project=project, member=member).count() > 0:
            del cleaned_data["project"]
            del cleaned_data["member"]
            raise forms.ValidationError('The user "%s" is already part of the project team for project "%s".' % (member, project))
        return cleaned_data
Run Code Online (Sandbox Code Playgroud)

但现在我问自己如何在干净方法中判断用户是否尝试创建新关系或更新关系.因为使用这种干净的方法,无法进行更新,因为它返回条目已存在的错误消息.

小智 18

试试这个:

if self.instance.pk:
   update_procedure()
else:
   insert_procedure()
Run Code Online (Sandbox Code Playgroud)


dzi*_*ida 5

您可以尝试更改此内容:

if ProjectMembership.objects.filter(project=project, member=member).count() > 0:
Run Code Online (Sandbox Code Playgroud)

这样的事情:

if ProjectMembership.objects.filter(project=project, member=member).exclude(pk=self.instance.id).count() > 0:
Run Code Online (Sandbox Code Playgroud)

实际上,你需要在排除之前检查self.instance是否为None,但希望这个小片段能让你知道如何在不重复表单的情况下完成任务.