【问题标题】:django - how to check in a clean method of a form whether it is an insert or an updatedjango - 如何检查表单的干净方法是插入还是更新
【发布时间】:2010-01-22 16:20:57
【问题描述】:

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


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    您可以尝试更改此设置:

    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 用于 exclude 之前,您需要检查它是否不是 None,但希望这个小 sn-p 能让您了解如何在不重复表单的情况下完成任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-08
      • 2014-10-26
      • 1970-01-01
      • 2012-09-24
      • 2016-09-13
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多