我是 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 .
