我有一个表单,在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 }}
将为空,但它不是。
答案 0 :(得分:2)
看起来你没有在你的视图中调用is_valid(),当你第一次访问.errors时会触发表单验证(反过来又会分配SignupForm.user):)
http://django.readthedocs.org/en/latest/ref/forms/api.html#django.forms.Form.errors