class UserForm(UserCreationForm):
def __init__(self, *arg, **kw):
super(UserForm, self).__init__(*arg, **kw)
# re-order so email appears last on this form
email_field = self.fields.pop('email')
self.fields['email'] = email_field
class Meta:
model = User
fields = ('first_name', 'last_name', 'username', 'email')
我有一个表单,用户可以更新他们的个人资料详细信息。
用户可以选择更新他们的passwords
,但不需要更新其他个人资料字段。
问题是,当password
和password confirmation
字段为空时,我的验证工作正在进行中。
我认为User
模型Password
字段是required=True
和blank=False
字段,因此我需要一种在此模型上验证时忽略表单空白输入的方法。
User
模型是随Django一起提供的模型:
from django.contrib.auth.models import User
由于
答案 0 :(得分:12)
UserCreationForm
旨在用于创建。创建一个新的ModelForm比使用这个更好。
class UserUpdateForm(forms.ModelForm):
# Feel free to add the password validation field as on UserCreationForm
password = forms.CharField(required=False, widget=forms.PasswordInput)
class Meta:
model = User
# Add all the fields you want a user to change
fields = ('first_name', 'last_name', 'username', 'email', 'password')
def save(self, commit=True):
user = super(UserUpdateForm, self).save(commit=False)
password = self.cleaned_data["password"]
if password:
user.set_password(password)
if commit:
user.save()
return user
或者如果你想继承我不推荐的UserCreationForm
。你可以这样做:
class UserForm(UserCreationForm):
password1 = forms.CharField(label=_("Password"), required=False
widget=forms.PasswordInput)
password2 = forms.CharField(label=_("Password confirmation"),
widget=forms.PasswordInput, required=False)
class Meta:
model = User
fields = ('first_name', 'last_name', 'username', 'email')
def save(self, commit=True):
user = super(UserUpdateForm, self).save(commit=False)
password = self.cleaned_data["password"]
if password:
user.set_password(password)
if commit:
user.save()
return user
我建议你使用简单的
class UserUpdateForm(forms.ModelForm):
class Meta:
model = User
# Add all the fields you want a user to change
fields = ('first_name', 'last_name', 'username', 'email')
对于密码更改,您可以使用另一个专用表单django.contrib.auth.forms.SetPasswordForm
,因为更改密码与更新用户信息的过程不同
答案 1 :(得分:0)
您可以创建自己的密码表单字段并手动处理。或者您可以自己覆盖干净方法并删除与密码相关的错误。