如何解决Django注册表单密码字段自定义样式不生效问题
问题原因
UserCreationForm中的password1、password2是表单类显式定义的字段,不属于从User模型自动生成的字段。Django表单Meta类下的widgets配置,仅对模型映射生成的字段生效,无法覆盖父类中已经提前声明的字段组件,因此你在Meta.widgets里给两个密码字段写的样式属性不会被加载,只有email、username这两个模型原生字段能正常应用配置。
解决方法
任选以下一种写法修改forms.py即可:
- 方法1:在表单初始化方法
__init__中单独指定密码字段的组件属性
from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User class CustomUserCreationForm(UserCreationForm): class Meta: model = User fields = ['email', 'username', 'password1', 'password2'] widgets = { 'email': forms.EmailInput(attrs={ 'type': 'email', 'class': 'form-control', 'id': 'exampleInputEmail', }), 'username': forms.TextInput(attrs={ 'type': 'text', 'class': 'form-control', 'id': 'exampleInputUsername', }), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 为显式定义的密码字段配置widget self.fields['password1'].widget = forms.PasswordInput(attrs={ 'type': 'password', 'class': 'form-control', 'id': 'exampleInputPassword1', }) self.fields['password2'].widget = forms.PasswordInput(attrs={ 'type': 'password', 'class': 'form-control', 'id': 'exampleInputPassword2', })
- 方法2:直接在自定义表单类中重写两个密码字段,显式绑定组件配置
from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User class CustomUserCreationForm(UserCreationForm): # 重写密码字段,直接配置widget属性 password1 = forms.CharField( widget=forms.PasswordInput(attrs={ 'type': 'password', 'class': 'form-control', 'id': 'exampleInputPassword1', }) ) password2 = forms.CharField( widget=forms.PasswordInput(attrs={ 'type': 'password', 'class': 'form-control', 'id': 'exampleInputPassword2', }) ) class Meta: model = User fields = ['email', 'username', 'password1', 'password2'] widgets = { 'email': forms.EmailInput(attrs={ 'type': 'email', 'class': 'form-control', 'id': 'exampleInputEmail', }), 'username': forms.TextInput(attrs={ 'type': 'text', 'class': 'form-control', 'id': 'exampleInputUsername', }), }
优化小技巧
如果表单所有输入框都需要统一加form-control这类通用样式,不需要逐个字段配置,在__init__方法里循环批量添加即可,减少重复代码:
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 批量给所有字段加通用样式类 for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' # 单独配置每个字段的专属id、其他特殊属性 self.fields['email'].widget.attrs['id'] = 'exampleInputEmail' self.fields['username'].widget.attrs['id'] = 'exampleInputUsername' self.fields['password1'].widget.attrs['id'] = 'exampleInputPassword1' self.fields['password2'].widget.attrs['id'] = 'exampleInputPassword2'
内容的提问来源于stack exchange,提问作者steqa
相关产品推荐
相关产品推荐

