Джанго форма не проверяет - PullRequest
8 голосов
/ 16 марта 2010

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

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

Ответы [ 4 ]

11 голосов
/ 16 марта 2010

Хех, у меня была точно такая же проблема. Проблема в том, что вы используете formset! Наборы форм позволяют все поля в форме быть пустыми. Однако, если у вас есть 2 поля и заполнено только одно, , тогда распознает все необходимые материалы Это происходит потому, что наборы форм созданы для «массового добавления», и иногда вам не нужно заполнять все дополнительные формы на странице. Действительно раздражает; Вы можете увидеть мое решение здесь.

1 голос
/ 08 декабря 2017

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


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



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

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

0 голосов
/ 30 октября 2010

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

Удачи!

0 голосов
/ 23 июня 2010

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

если нет (formset.errors): ...

вместо:

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

...