0

构建使用 django.forms.formsets.formset_factory 在表单集中检查空值(即空字符串)的验证器的最佳方法是什么?

我现在使用的是,首先是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,]
                           )

然后shell命令:

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 没有错误。我究竟做错了什么?或者你怎么能让检查“”的验证器出错并传递错误?

4

1 回答 1

2

django 中的额外表单(动态添加的表单)可以为空。在 shell 中,这是由 data 参数模拟的'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
于 2015-05-28T18:21:39.327 回答