在 Django 中重用表单字段
Reuse form fields in Django
这里提出了这个问题:Django: Reuse form fields without inheriting?
虽然,接受的答案很明确,但是如果我想覆盖很多表单方法,它不是很方便。
投票最多的答案有点困难,而且不起作用。
那么,在继承或不继承的情况下,将相同字段包含到多个表单(表单或 ModelForms)中的清晰和 pythonic 方法是什么?
例如,我希望以下 class 可以重复使用。
class SetPasswordMixin(forms.Form):
password1 = forms.CharField(label=_('Password'), widget=forms.PasswordInput(attrs={'placeholder': _('Password')}))
password2 = forms.CharField(label=_('Password confirmation'),
widget=forms.PasswordInput(attrs={'placeholder': _('Password confirmation')}))
def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(_("Passwords don't match"))
return password2
您可以使用多重继承组合两种形式:
class SetPasswordMixin(forms.Form):
...
class MessageFormBase(forms.ModelForm):
class Meta:
model = Message
class MessageForm(MessageFormBase, SetPasswordMixin):
pass
我刚刚制作了一个无需继承即可解决此问题的代码段:
https://djangosnippets.org/snippets/10523/
它使用了crispy-form,但同样的想法也可以在没有crispy-forms的情况下使用。想法是在同一个表单标签下使用多个表单。
这里提出了这个问题:Django: Reuse form fields without inheriting?
虽然,接受的答案很明确,但是如果我想覆盖很多表单方法,它不是很方便。
投票最多的答案有点困难,而且不起作用。
那么,在继承或不继承的情况下,将相同字段包含到多个表单(表单或 ModelForms)中的清晰和 pythonic 方法是什么?
例如,我希望以下 class 可以重复使用。
class SetPasswordMixin(forms.Form):
password1 = forms.CharField(label=_('Password'), widget=forms.PasswordInput(attrs={'placeholder': _('Password')}))
password2 = forms.CharField(label=_('Password confirmation'),
widget=forms.PasswordInput(attrs={'placeholder': _('Password confirmation')}))
def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(_("Passwords don't match"))
return password2
您可以使用多重继承组合两种形式:
class SetPasswordMixin(forms.Form):
...
class MessageFormBase(forms.ModelForm):
class Meta:
model = Message
class MessageForm(MessageFormBase, SetPasswordMixin):
pass
我刚刚制作了一个无需继承即可解决此问题的代码段:
https://djangosnippets.org/snippets/10523/
它使用了crispy-form,但同样的想法也可以在没有crispy-forms的情况下使用。想法是在同一个表单标签下使用多个表单。