2

我是 django 的新手,我认为到目前为止它很棒。我今天遇到了这个奇怪的问题:我有这个 FormModel:

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

现在移动字段在模型中有blank=True但我希望它只在表单中是必需的,所以我在__init__中做到了。现在它使该字段成为必填字段,但并未将required=""添加到文本输入中。现在,如果我像执行 mobile2字段一样覆盖了该字段(并添加了required=True ),我就不会有这个问题。这是一个问题,因为如果我希望在字段上显示所需的属性,我必须覆盖表单中的字段以添加required=True,这将违反DRY原则。我错过了什么还是这是某种错误?

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

4

3 回答 3

2

请注意,此答案假定您使用的是常规 Django 表单,我在您提到您使用的是软盘表单之前写了它。

Djangorequired在呈现表单字段时当前不添加 HTML 5 属性。覆盖mobile字段声音的小部件对我来说看起来不错。您正在更改小部件,而不是复制字段,所以我认为您不必担心它会干燥。

请注意, 中所需的设置__init__会产生效果 - 如果您提交的表单为空值mobile,那么您将收到验证错误。除非您将其添加到其小部件属性中,否则您的mobile2字段将不会出现required在呈现的 HTML 中。

Django 将required在 Django 1.10 中将属性添加到表单字段,请参见票证 #22383

于 2016-05-05T08:03:09.157 回答
1

这实际上在您的__init__. 您只需将所需的属性添加到小部件属性:

def __init__(self, *args, **kwargs): super(RegisterForm2, self).__init__(*args, **kwargs) self.fields['mobile'].required = True self.fields['mobile'].widget.attrs['required'] = 'required'

于 2016-12-02T14:51:10.557 回答
0

但我希望它只需要在表格中

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

您也可以在 views.py 中执行此操作。这就是我喜欢这样做的方式。

form.fields['mobile'].widget.attrs['required'] = True 
于 2018-10-18T12:11:07.090 回答