【问题标题】:Django formset doesn't validateDjango formset 不验证
【发布时间】: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') 被调用,看似假设它是一个有效的表单。

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

【问题讨论】:

    标签: django forms formset


    【解决方案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() 被调用才会被填充,所以这个解决方案完全行不通。
          猜你喜欢
          • 2013-02-02
          • 2018-08-08
          • 2011-02-01
          • 2018-05-28
          • 1970-01-01
          • 2023-04-06
          • 2018-08-29
          • 2019-10-16
          • 1970-01-01
          相关资源
          最近更新 更多