Skip to main content
 首页 » 编程设计

python之django:必填字段在 HTML 中没有 "required"属性

2024年08月22日34yjmyzz

我是 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 原则。我是否遗漏了什么或者这是某种错误?

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

请您参考如下方法:

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

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

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

Django 将在 Django 1.10 中为表单字段添加 required 属性,参见 ticket #22383 .