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

时间:2016-05-05 07:36:52

标签: python django django-models django-forms django-floppyforms

我是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 =“”。现在,如果我已经覆盖了该字段(并添加了 required = True ),就像我执行 mobile2 字段一样,我就不会遇到此问题。这是一个问题,因为如果我想要在字段上显示所需的属性,我必须覆盖表单中的字段以添加 required = True ,这将违背 DRY 原则。我错过了什么或这是某种错误吗?

修改 我没有提到我使用的是软盘形式。它可能与此有关。我必须进一步调查这个问题。

3 个答案:

答案 0 :(得分:2)

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

当Django呈现表单字段时,它目前不会添加required HTML 5属性。覆盖mobile字段的小部件听起来对我来说没问题。您正在更改小部件,而不是重复该字段,因此我不认为您需要担心它是干的。

请注意,__init__中所需的设置正在生效 - 如果您提交的表格中包含mobile的空值,那么您将收到验证错误。您的mobile2字段在呈现的HTML中不会有required,除非您将其添加到其窗口小部件中。

Django会将required属性添加到Django 1.10中的表单字段中,请参阅ticket #22383

答案 1 :(得分: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'

答案 2 :(得分:0)

  

但我希望仅以表格的形式要求它

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

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

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