我有一个表单,可以在 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 方法无法进行更新,因为它返回条目已存在的错误消息。
试试这个:
if self.instance.pk: update_procedure() else: insert_procedure()
您可以尝试更改此设置:
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,但希望这个小片段能让您了解如何在不重复表单的情况下完成任务。
也许有版本更新,但我不得不修改埃尔顿的答案
if self.pk:
update_procedure()
else:
insert_procedure()