Django formset не проверяет

Я пытаюсь сохранить набор форм, но он, похоже, обходит 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') get называется, по-видимому, предполагая, что это действительная форма.

возможно, я что-то пропустил здесь, но я не могу посмотри, что случилось. Я хочу, чтобы это произошло, как и любая другая форма, Если поле требуется выплюнуть ошибку, если она не заполнена. Есть идеи?

4 ответов


Хех, у меня была точно такая же проблема. Проблема в том, что вы используете formset!! Formsets разрешить все поля в форме должны быть пустыми. Если, однако, у вас есть 2 поля и заполните только одно, затем оно узнает ваши необходимые вещества. Это происходит потому, что наборы форм созданы для "массового добавления", и иногда вы не хотите заполнять все дополнительные формы на странице. Действительно раздражает; вы можете видеть мое решение здесь.


для каждого из обязательных полей добавьте дополнительную запись в параметр attrs


    resident_status = forms.ChoiceField(widget=forms.Select(
        attrs={'class': 'form-control', 'required': 'required'}), choices=President.RESIDENT_STATUS,
        required=True)



Как вы можете видеть, я поддерживаю required=True для проверки формы django, но указываю "required": "required" для шаблона, чтобы настаивать на обязательности поля.

надеюсь, что это поможет.


добавить 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)

удачи!


использование:

Если не любой(formset с.ошибки. :)..

вместо:

Если formset с.is_valid(): ...