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

问题描述 投票:0回答:3

我有一个表单,可以在 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

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

django-forms
3个回答
19
投票

试试这个:

if self.instance.pk:
   update_procedure()
else:
   insert_procedure()

6
投票

您可以尝试更改此设置:

if ProjectMembership.objects.filter(project=project, member=member).count() > 0:

像这样:

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

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


0
投票

也许有版本更新,但我不得不修改埃尔顿的答案

if self.pk:
   update_procedure()
else:
   insert_procedure()
© www.soinside.com 2019 - 2024. All rights reserved.