Django UserCreationForm 自定义字段
Django UserCreationForm custom fields
我正在尝试创建用户注册表单并添加一些自定义字段。为此,我已经 subclassed UserCretionForm 并添加了字段,如 django 文档中所示。然后我基于这个表单创建了基于函数的视图和模板。现在,我可以成功创建用户,并且该用户已按预期添加到管理面板。问题是,我无法为此表单的字段添加 class 和样式。除用户名字段外,小部件不工作。我在这里添加脚本是为了更准确地说明我的问题:
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=32, help_text='First name')
last_name = forms.CharField(max_length=32, help_text='Last name')
email = forms.EmailField(max_length=64, help_text='Enter a valid email address')
class Meta(UserCreationForm.Meta):
model = User
# I've tried both of these 'fields' declaration, result is the same
# fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email',)
widgets = {
'username': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}),
'first_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}),
'last_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'}),
'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email'}),
'password1': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}),
'password2': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password Again'}),
}
views.py
from django.contrib.auth import login, authenticate
from django.contrib.auth.views import LoginView
from django.shortcuts import render, redirect
from .forms import SignUpForm, SignInForm
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('/')
else:
form = SignUpForm()
return render
'forms.py' 中的小部件不工作,'username' 字段除外。换句话说,在网络浏览器中 'username' 输入显示为 "class='form-control'" 和 "placeholder='Username'",但其他字段没有我预期的 class 和占位符属性。可能是什么原因?
您不需要在小部件下定义字段。在 class 级别将它们定义为静态。
class SignUpForm(UserCreationForm):
username = forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}))
first_name = forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}), max_length=32, help_text='First name')
last_name=forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'}), max_length=32, help_text='Last name')
email=forms.EmailField(forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email'}), max_length=64, help_text='Enter a valid email address')
password1=forms.CharField(forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}))
password2=forms.CharField(forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password Again'}))
class Meta(UserCreationForm.Meta):
model = User
# I've tried both of these 'fields' declaration, result is the same
# fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email',)
只需要在@Chirdeep 的回答上添加注释,如果您尝试呈现表单,您将丢失密码的 field.help_text。
为了修复,我们可以重新编写如下表格
请注意从 django.contrib.auth
导入 password_validation
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import password_validation
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.validators import UnicodeUsernameValidator
username_validator = UnicodeUsernameValidator()
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=12, min_length=4, required=True, help_text='Required: First Name',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}))
last_name = forms.CharField(max_length=12, min_length=4, required=True, help_text='Required: Last Name',
widget=(forms.TextInput(attrs={'class': 'form-control'})))
email = forms.EmailField(max_length=50, help_text='Required. Inform a valid email address.',
widget=(forms.TextInput(attrs={'class': 'form-control'})))
password1 = forms.CharField(label=_('Password'),
widget=(forms.PasswordInput(attrs={'class': 'form-control'})),
help_text=password_validation.password_validators_help_text_html())
password2 = forms.CharField(label=_('Password Confirmation'), widget=forms.PasswordInput(attrs={'class': 'form-control'}),
help_text=_('Just Enter the same password, for confirmation'))
username = forms.CharField(
label=_('Username'),
max_length=150,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[username_validator],
error_messages={'unique': _("A user with that username already exists.")},
widget=forms.TextInput(attrs={'class': 'form-control'})
)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2',)
我正在尝试创建用户注册表单并添加一些自定义字段。为此,我已经 subclassed UserCretionForm 并添加了字段,如 django 文档中所示。然后我基于这个表单创建了基于函数的视图和模板。现在,我可以成功创建用户,并且该用户已按预期添加到管理面板。问题是,我无法为此表单的字段添加 class 和样式。除用户名字段外,小部件不工作。我在这里添加脚本是为了更准确地说明我的问题:
forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=32, help_text='First name')
last_name = forms.CharField(max_length=32, help_text='Last name')
email = forms.EmailField(max_length=64, help_text='Enter a valid email address')
class Meta(UserCreationForm.Meta):
model = User
# I've tried both of these 'fields' declaration, result is the same
# fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email',)
widgets = {
'username': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}),
'first_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}),
'last_name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'}),
'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email'}),
'password1': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}),
'password2': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password Again'}),
}
views.py
from django.contrib.auth import login, authenticate
from django.contrib.auth.views import LoginView
from django.shortcuts import render, redirect
from .forms import SignUpForm, SignInForm
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('/')
else:
form = SignUpForm()
return render
'forms.py' 中的小部件不工作,'username' 字段除外。换句话说,在网络浏览器中 'username' 输入显示为 "class='form-control'" 和 "placeholder='Username'",但其他字段没有我预期的 class 和占位符属性。可能是什么原因?
您不需要在小部件下定义字段。在 class 级别将它们定义为静态。
class SignUpForm(UserCreationForm):
username = forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}))
first_name = forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}), max_length=32, help_text='First name')
last_name=forms.CharField(forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'}), max_length=32, help_text='Last name')
email=forms.EmailField(forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email'}), max_length=64, help_text='Enter a valid email address')
password1=forms.CharField(forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}))
password2=forms.CharField(forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password Again'}))
class Meta(UserCreationForm.Meta):
model = User
# I've tried both of these 'fields' declaration, result is the same
# fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email',)
只需要在@Chirdeep 的回答上添加注释,如果您尝试呈现表单,您将丢失密码的 field.help_text。
为了修复,我们可以重新编写如下表格
请注意从 django.contrib.auth
password_validation
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import password_validation
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.validators import UnicodeUsernameValidator
username_validator = UnicodeUsernameValidator()
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=12, min_length=4, required=True, help_text='Required: First Name',
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'}))
last_name = forms.CharField(max_length=12, min_length=4, required=True, help_text='Required: Last Name',
widget=(forms.TextInput(attrs={'class': 'form-control'})))
email = forms.EmailField(max_length=50, help_text='Required. Inform a valid email address.',
widget=(forms.TextInput(attrs={'class': 'form-control'})))
password1 = forms.CharField(label=_('Password'),
widget=(forms.PasswordInput(attrs={'class': 'form-control'})),
help_text=password_validation.password_validators_help_text_html())
password2 = forms.CharField(label=_('Password Confirmation'), widget=forms.PasswordInput(attrs={'class': 'form-control'}),
help_text=_('Just Enter the same password, for confirmation'))
username = forms.CharField(
label=_('Username'),
max_length=150,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[username_validator],
error_messages={'unique': _("A user with that username already exists.")},
widget=forms.TextInput(attrs={'class': 'form-control'})
)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2',)