11

我正在尝试保存一个表单集,但它似乎正在绕过 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') 似乎假设它是一个有效的形式而被调用。

我可能在这里遗漏了一些东西,但我看不出有什么问题。我想要发生的是,就像任何其他表单一样,如果该字段没有填写则需要吐出错误。有什么想法吗?

4

4 回答 4

15

呵呵,我遇到了同样的问题。问题是您使用的是表单集!表单集允许表单中的所有字段为空白。但是,如果您有 2 个字段,并且只填写一个,那么它将识别您所需的内容。这样做是因为表单集是为“批量添加”而制作的,有时您不想填写页面上的所有额外表单。真烦人;你可以在这里看到我的解决方案

于 2010-03-16T05:02:13.680 回答
3

对于每个必填字段,在 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' 以坚持要求该字段。

希望有帮助。

于 2017-12-08T07:07:12.963 回答
0

添加 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)

祝你好运!

于 2010-10-30T17:35:19.637 回答
-4

采用:

如果没有(formset.errors):...

代替:

如果 formset.is_valid(): ...

于 2010-06-23T11:24:25.603 回答