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管理-表单验证错误

django formset 未验证,因为需要 ID

如何在 Django 中根据需要为 formset_factory 设置每个字段(如何验证表单集中的空白表单)

与 django-dynamic-formset 一起使用的 Django Formset 不显示删除链接

Django之路——form modelform formset modelformset的各种用法

Django-dynamic-formsets 不工作