我尝试在我的注册表单中启用占位符,其中包含 4 个字段:电话、电子邮件、密码 1、密码 2。对于前两个字段全部正确,但对于密码字段则不起作用。
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from customuser.models import User
from django.forms import TextInput,EmailInput,PasswordInput
class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ('phone', 'email', 'password1', 'password2', 'is_client','is_partner')
widgets = {
'email': EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email adress'}),
'phone': TextInput(attrs={'class': 'form-control', 'placeholder': 'Phone number +79011234567'}),
'password1': PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password from numbers and letters of the Latin alphabet'}),
'password2': PasswordInput(attrs={'class': 'form-control', 'placeholder': '
Password confirmation'}),
}
Meta.widgets
选项不适用于表单中声明的字段。请参阅文档中的注释。在这种情况下,password1
和password2
在UserCreationForm
上声明(它们不是模型字段),因此您不能在widgets
中使用它们。
您可以在
__init__
方法中设置小部件:
class SignUpForm(UserCreationForm):
class Meta:
model = User
fields = ('phone', 'email', 'is_client', 'is_partner')
widgets = {
'email': EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email adress'}),
'phone': TextInput(attrs={'class': 'form-control', 'placeholder': 'Phone number +79011234567'}),
}
def __init__(self, *args, **kwargs):
super(SignUpForm, self).__init__(*args, **kwargs)
self.fields['password1'].widget = PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password from numbers and letters of the Latin alphabet'})
self.fields['password2'].widget = PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password confirmation'})
这段代码运行良好
class SignUpForm(UserCreationForm):
password1 = forms.CharField(max_length=16, widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password from numbers and letters of the Latin alphabet'}))
password2 = forms.CharField(max_length=16, widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password confirm'}))
class Meta:
model = User
fields = ('phone', 'email', 'password1', 'password2', 'is_client','is_partner')
widgets = {
'email': EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email adress'}),
'phone': TextInput(attrs={'class': 'form-control', 'placeholder': 'Phone number format +79011234567'}),
}
我测试了@Alasdair 的解决方案并以这种方式为我工作:
from django import forms
from django.contrib import auth
from django.contrib.auth.forms import UserCreationForm
from django.utils.translation import ugettext_lazy as _
class RegistrationForm(UserCreationForm):
first_name = forms.CharField(label=_("First name"), widget=forms.TextInput(attrs={'placeholder': _("First name")}))
email = forms.EmailField(label=_("Email"), widget=forms.TextInput(attrs={'placeholder': _("Email")}))
class Meta(UserCreationForm.Meta):
model = auth.get_user_model()
fields = [
'first_name',
'email',
'password1',
'password2'
]
def __init__(self, *args, **kwargs):
super(InviteRegistrationForm, self).__init__(*args, **kwargs)
self.fields['password1'].widget = forms.PasswordInput(attrs={'placeholder': _("Password")})
self.fields['password2'].widget = forms.PasswordInput(attrs={'placeholder': _("Password")})
如果有人对实现 @Alasdair 代码有任何困惑,请参考下面的代码。`from django import forms 从 django.contrib.auth.forms 导入 UserCreationForm 从 django.utils.translation 导入 gettext_lazy as _ 从 .models 导入 CustomUser
类 CustomUserCreationForm(UserCreationForm): def init(self, *args, **kwargs): super().init(*args, **kwargs) self.fields['password1'].widget = forms.PasswordInput(attrs={'placeholder': _("密码")}) self.fields['password2'].widget = forms.PasswordInput(attrs={'placeholder': _("确认密码")})
class Meta(UserCreationForm):
model = CustomUser
fields = ('email', 'fullname', 'password1', 'password2', 'promo_code')
widgets = {
'email': forms.EmailInput(attrs={'placeholder': 'Email'}),
'fullname': forms.TextInput(attrs={'placeholder': 'Full Name'}),
'promo_code': forms.TextInput(attrs={'placeholder': 'Promo Code'}),
}
`