关于python:django:必填字段没有HTML中的“必需”属性

django: Required Field Not Having The “required” Attribute in HTML

我对姜戈不熟悉,我觉得到目前为止这很好。今天我遇到了一个奇怪的问题:我有这个表单模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class RegisterForm2(UserCreationForm):
    mobile2 = forms.CharField(
        label=_('Mobile Confirmation'),
        max_length=50,
        required=True,
        widget = forms.TextInput(attrs = {'class':'nocopy'})
    )

    class Meta:
        model = User
        fields = ['username', 'mobile', 'mobile2', 'guardian_mobile']
        labels = {
            'username': _('Government ID'),
        }
        widgets = {
            # workaround since __init__ setting to required doesnt work
            'mobile': forms.TextInput(attrs = {'required':''}),
        }

    def __init__(self, *args, **kwargs):
        super(RegisterForm2, self).__init__(*args, **kwargs)

        self.fields['mobile'].required = True

现在mobile字段在模型中有blank=true,但我只希望在表单中需要它,所以我在uu in it_uuuuuuuuu中这样做了。现在,它将字段设置为必需,但不向文本输入中添加required=。现在,如果我像mobile2字段那样重写了字段(并添加了required=true),我就不会有这个问题。这是一个问题,因为如果我想要在字段上显示所需的属性,我必须重写表单中的字段,以添加Required=true,这将违反dry原则。我是缺了什么东西还是这是某种虫子?

编辑:我没有提到我使用的是软盘。可能与此有关。我必须进一步调查这个问题。


注意这个答案假设你使用的是普通的django表单,我在你提到你使用的是软盘表单之前就写了它。

Django当前在呈现表单字段时不添加requiredhtml 5属性。覆盖mobile字段的小部件对我来说似乎没问题。你在更改小部件,而不是复制字段,所以我认为你不需要担心它是干的。

请注意,__init__中所需的设置是有效的—如果您提交的表单中mobile的值为空,那么您将得到一个验证错误。您的mobile2字段在呈现的HTML中不会有required,除非您将其添加到其widget attrs中。

django将把required属性添加到django 1.10中的表单字段中,请参见票据22383。


这在你的__init__中实际上是可能的。您只需将所需的属性添加到小部件属性:

埃多克斯1〔8〕


but i want it to be required in the form only

1
'mobile': forms.TextInput(attrs = {'required':''}),

也可以在views.py中执行此操作。我喜欢这样做。

1
form.fields['mobile'].widget.attrs['required'] = True