2015-05-28 3 views
0

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

Что я использую сейчас, сначала forms.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() 

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

ответ

1

Дополнительные формы (динамически добавленные) могут быть пустыми в джанго. В оболочке это моделируется параметром данных '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 
Смежные вопросы