Django formset 不验证
Posted
技术标签:
【中文标题】Django formset 不验证【英文标题】:Django formset doesn't validate 【发布时间】:2011-01-27 23:17:56 【问题描述】:我正在尝试保存表单集,但它似乎绕过了 is_valid(),即使有必填字段。
为了测试这个,我有一个简单的表格:
class AlbumForm(forms.Form):
name = forms.CharField(required=True)
观点:
@login_required
def add_album(request, artist):
artist = Artist.objects.get(slug__iexact=artist)
AlbumFormSet = formset_factory(AlbumForm)
if request.method == 'POST':
formset = AlbumFormSet(request.POST, request.FILES)
if formset.is_valid():
return HttpResponse('worked')
else:
formset = AlbumFormSet()
return render_to_response('submissions/addalbum.html',
'artist': artist,
'formset': formset,
, context_instance=RequestContext(request))
还有模板:
<form action="" method="post" enctype="multipart/form-data">% csrf_token %
formset.management_form
% for form in formset.forms %
<ul class="addalbumlist">
% for field in form %
<li>
field.label_tag
field
field.errors
</li>
% endfor %
</ul>
% endfor %
<div class="inpwrap">
<input type="button" value="add another">
<input type="submit" value="add">
</div>
</form>
最终发生的事情是我在没有输入名称的情况下点击“添加”然后 HttpResponse('worked') 被调用,看似假设它是一个有效的表单。
我可能在这里遗漏了一些东西,但我看不出有什么问题。我想要发生的是,就像任何其他表单一样,如果该字段没有填写则需要吐出错误。有什么想法吗?
【问题讨论】:
【参考方案1】:嘿,我遇到了同样的问题。问题是您使用的是表单集!表单集允许表单中的所有字段为空白。但是,如果您有 2 个字段,并且只填写了一个,那么它将识别您所需的内容。这样做是因为表单集是为“批量添加”而制作的,有时您不想填写页面上的所有额外表单。真烦人;你可以在这里看到my solution。
【讨论】:
【参考方案2】:对于每个必填字段,在 attrs 参数中添加一个额外的条目
resident_status = forms.ChoiceField(widget=forms.Select(
attrs='class': 'form-control', 'required': 'required'), choices=President.RESIDENT_STATUS,
required=True)
如您所见,我为 django 的表单验证维护 required=True,但为模板指定 'required':'required' 以坚持要求该字段。
希望对您有所帮助。
【讨论】:
【参考方案3】:添加 2 行。
if request.method == 'POST':
def initial_form_count(self): return 10 # the number of forms
AlbumFormSet.initial_form_count = initial_form_count
formset = AlbumFormSet(request.POST, request.FILES)
祝你好运!
【讨论】:
【参考方案4】:使用:
如果没有(formset.errors):...
代替:
如果 formset.is_valid(): ...
【讨论】:
formset.errors
直到formset.is_valid()
被调用才会被填充,所以这个解决方案完全行不通。以上是关于Django formset 不验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 中根据需要为 formset_factory 设置每个字段(如何验证表单集中的空白表单)
与 django-dynamic-formset 一起使用的 Django Formset 不显示删除链接