在.clean方法之后,Django表单的属性会发生什么?

时间:2014-10-09 22:15:11

标签: django forms

我有一个表单,在clean方法上,设置一个表单属性:

class SignupForm(forms.ModelForm):
    email = forms.CharField(…)
    …

    def __init___(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        …

    def clean(self):
        data = self.cleaned_data
        self.user = User.objects.get(email=data.get("email"))
        …
        return data

如果表单已提交并且出现错误,我会尝试在模板中使用form.user

但出于某种原因,form.user为None,即使我可以验证是否正在设置self.user。

我确定了一个假的验证错误:

    def clean(self):
        data = self.cleaned_data
        self.user = User.objects.get(email=data.get("email"))
        raise forms.ValidationError("User found: %s" % self.user)

然后在模板中:

The user is {{ form.user }}.

The form errors are {{ form.errors }}

结果是:

The user is None.

The form errors are 
__all__
User found: Jordan Reiter.

这里有趣的部分:如果我反转模板上显示的顺序,突然为form.user设置了值:

The form errors are {{ form.errors }}

The user is {{ form.user }}.

结果是:

The form errors are 
__all__
User found: Jordan Reiter.

The user is Jordan Reiter.

这里发生了什么?我是否需要提供类似

的内容
{% if form.errors %}<!-- do nothing -->{% endif %}

在顶部只是form.user可以在模板中使用吗?

这是Django 1.4.15。

澄清

为了澄清,我在表单上调用.is_valid。如果没有该电话,{{ form.errors }}将为空,但它不是。

1 个答案:

答案 0 :(得分:2)

看起来你没有在你的视图中调用is_valid(),当你第一次访问.errors时会触发表单验证(反过来又会分配SignupForm.user):)

http://django.readthedocs.org/en/latest/ref/forms/api.html#django.forms.Form.errors