Django 表单模板错误
Posted
技术标签:
【中文标题】Django 表单模板错误【英文标题】:Django Form Template Errors 【发布时间】:2012-01-09 19:32:30 【问题描述】:我给自己写了一个表格:
class Autopoweroff_Form(forms.Form):
autopoweroff_groups = forms.CharField(required=True)
autopoweroff_groups_hosts = forms.CharField(required=True)
autopoweroff_groups_start = forms.CharField(required=True)
autopoweroff_groups_end = forms.CharField(required=True)
autopoweroff_groups_startup_delay = forms.CharField(required=True)
autopoweroff_groups_idle_time = forms.CharField(required=True)
现在我知道我不必明确设置 reuqired=True 但请暂时忍受。 无论如何,让我们继续前进。
现在因为我讨厌在视图中进行验证等操作,所以我只为该表单定义了一个更新函数:
def update(self, data):
if not self.is_bound and data is not None:
raise Exception()
if self.is_valid():
curr_group = self.cleaned_data['autopoweroff_groups']
...
然后在我看来这样称呼它:
if request.method == 'POST':
form = Autopoweroff_Form(data=request.POST)
form.update(data=request.POST)
return HttpResponseRedirect('/admin/thin/create_autopoweroff')
else:
form = Autopoweroff_Form()
...
现在的问题是,如果我没有在表单中输入任何内容,表单将按原样返回,而不会显示任何应有的错误。我也知道它不会做任何事情,因为:
https://docs.djangoproject.com/en/1.3/ref/forms/validation/
事实上,如果表单中有任何错误,Django 目前会彻底清除cleaned_data 字典。但是,这种行为将来可能会发生变化,因此首先要自己清理干净并不是一个坏主意。
如果我尝试:
def update(self, data):
if not self.is_bound and data is not None:
raise Exception()
if self.is_valid():
curr_group = self.cleaned_data['autopoweroff_groups']
...
else:
print self.errors
我得到了我希望在模板中看到的错误。 我也试过了:
def clean_autopoweroff_groups(self):
autopoweoff_groups = self.cleaned_data.get('autopoweroff_groups', "")
if autopoweoff_groups == '':
print "Validation Error"
raise forms.ValidationError('Please Enter A Name')
return autopoweroff_groups
我到底做错了什么?
更新: 在我看来:
if request.method == 'POST':
form = Autopoweroff_Form(data=request.POST)
if form.is_valid():
form.update(data=request.POST)
return HttpResponseRedirect('/admin/thin/create_autopoweroff')
else:
form = Autopoweroff_Form()
并在我的表单中删除 if self.is_valid()
【问题讨论】:
【参考方案1】:Django 已内置验证,因此您无需重写它:
class Autopoweroff_Form(forms.Form):
# I suggest not prefixing your fields with the name of the class
groups = forms.CharField(required=True)
hosts = forms.CharField(required=True)
start = forms.CharField(required=True)
end = forms.CharField(required=True)
delay = forms.CharField(required=True)
idle_time = forms.CharField(required=True)
在你看来:
if request.method == 'POST':
form = Autopoweroff_Form(data=request.POST)
if form.is_valid():
return HttpResponseRedirect('/admin/thin/create_autopoweroff')
else:
form = Autopoweroff_Form()
请注意,您在视图中调用 is_valid(),而不是在表单中。
如果您想对单个字段或一组字段执行更复杂的验证,您可以覆盖表单clean()
和clean_[field_name]()
方法。
看这里:
https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute
【讨论】:
以上是关于Django 表单模板错误的主要内容,如果未能解决你的问题,请参考以下文章
如果仅在模板中立即给出错误输入,如何在 Django 模板中显示表单错误?
如何在模板中显示 Django '__all__' 表单错误?