Как построить валидатор в Django для форм-наборов, когда текст пуст?

Каков наилучший способ создания валидатора, который проверяет наличие пустого значения (то есть пустой строки) в наборе форм с использованием django.forms.formsets.formset_factory?

Теперь я использую сначала формы.py:

from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import URLValidator

class UrlsForm(forms.Form):
    def validate_contains_something(value):
        if value == " ":
            raise ValidationError(u'(link)value: "%s" is empty' % value)

    my_url = forms.URLField(required=True,
                            max_length=200,
                            label = '',
                            widget=forms.TextInput(
                                attrs=
                                {
                                    'placeholder':'< enter url here >',
                                    'size':75,
                                    'class':'data',
                                }),
                            validators=[validate_contains_something,
                                        URLValidator,]
                           )

Затем команды оболочки:

from django.forms.formsets import formset_factory
from doc_select_new.forms import UrlsForm
from django.forms.formsets import BaseFormSet
UrlsFormSet = formset_factory(UrlsForm, formset=BaseFormSet, validate_max=True)

data = { 'form-INITIAL_FORMS': '0',
         'form-MAX_NUM_FORMS': '1000',
         'form-TOTAL_FORMS': '3',
         'form-0-my_url': '',
         'form-1-my_url': 'http://www.google.com/',
         'form-2-my_url': 'https://www.djangoproject.com/',
}
formset = UrlsFormSet(data)
valid_or_not = formset.is_valid()

Что не дает ошибки для form-0-my_url. Что я делаю неправильно? Или как вы можете позволить валидатору для проверки '' пойти не так и выдать ошибку?

1 ответ

Дополнительные формы (динамически добавленные) могут быть пустыми в Django. В оболочке это моделируется 'form-INITIAL_FORMS' параметр данных - так как он равен 0, django считает, что все 3 формы являются дополнительными формами. Установка его в 1 скажет django проверить первую форму.

Такое поведение связано с empty_permitted аргумент формы. Таким образом, другой способ состоит в том, чтобы установить его False, Это приведет к проверке всех форм:

class UrlsForm(forms.Form):

    def __init__(self, *args, **kwargs):
        super(UrlsForm, self).__init__(*args, **kwargs)
        self.empty_permitted = False
Другие вопросы по тегам