2

我有以下表格:

class GroupForm(forms.ModelForm):
    class Meta:
        model = Group

    def __init__(self, customer):
        self.customer = customer
        super(GroupForm, self).__init__()

    def clean(self):
        cleaned_data = super(GroupForm, self).clean()
        email = cleaned_data.get('email')

        print email

        try:
            groups = Group.objects.filter(email=email, customer=self.customer)
            if groups:
                messsge = u"That email already exists"
                self._errors['email'] = self.error_class([messsge])
        except:
            pass

        return cleaned_data 

我从视图中调用表单,如下所示:

if request.method == "POST":
    form = GroupForm(request.POST, customer, instance=group)
    if form.is_valid():
        form.save()

问题是验证永远不会被触发。此外,电子邮件的打印永远不会被击中,这意味着 clean 功能永远不会被击中。

为什么会出现这种情况?

4

1 回答 1

1

我在 SO 上经常看到这个问题,原因通常是相同的。您已经覆盖了init方法并更改了签名,因此第一个元素是 now customer,而不是data。但是当您在视图中实例化它时,您request.POST首先传递,因此参数与正确的变量不匹配。

此外,您没有将参数传递给 super 方法,因此甚至从未见过 POST。

改为这样做:

class GroupForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.customer = kwargs.pop('customer', None)
        super(GroupForm, self).__init__(*args, **kwargs)

在视图中:

form = GroupForm(request.POST, customer=customer, instance=group)
于 2013-09-12T17:07:18.933 回答