Django 创建自定义 UserCreationForm
Posted
技术标签:
【中文标题】Django 创建自定义 UserCreationForm【英文标题】:Django create custom UserCreationForm 【发布时间】:2011-08-10 08:28:33 【问题描述】:我在 Django 中启用了用户身份验证模块,但是当我使用 UserCreationForm
时,它只要求输入用户名和两个密码/密码确认字段。我还想要电子邮件和全名字段,都设置为必填字段。
我已经这样做了:
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
class RegisterForm(UserCreationForm):
email = forms.EmailField(label = "Email")
fullname = forms.CharField(label = "Full name")
class Meta:
model = User
fields = ("username", "fullname", "email", )
现在表单会显示新字段,但不会将它们保存到数据库中。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:User 模型中没有名为fullname
的字段。
如果您希望使用原始模型存储名称,则必须将其分别存储为名字和姓氏。
编辑:如果您只想要表单中的一个字段并仍使用原始用户模型,请使用以下内容:
你可以这样做:
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
class RegisterForm(UserCreationForm):
email = forms.EmailField(label = "Email")
fullname = forms.CharField(label = "First name")
class Meta:
model = User
fields = ("username", "fullname", "email", )
现在您必须按照 manji 所说的操作并覆盖 save 方法,但是由于 User 模型没有全名字段,它应该如下所示:
def save(self, commit=True):
user = super(RegisterForm, self).save(commit=False)
first_name, last_name = self.cleaned_data["fullname"].split()
user.first_name = first_name
user.last_name = last_name
user.email = self.cleaned_data["email"]
if commit:
user.save()
return user
注意:您应该为全名字段添加一个干净的方法,以确保输入的全名仅包含两个部分,名字和姓氏,并且它具有其他有效字符。
用户模型参考源代码:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py#L201
【讨论】:
好回答老兄。我不关心数据库中的“全名”字段,但我可以编辑注册表以询问不是名字和姓氏而是一个字段“全名”吗? 我不太确定我是否遵循...您是说您只想在表单中包含一个字段作为全名,但您不在乎它是否被保存?或者您是在问如何拥有一个全名字段并且仍然能够使用 User 模型保存它? 我想在表单中有一个名为“全名”的字段,但我想将它保存在用户模型的全名字段中。如果我不能,请拆分全名字段以保存在模型上的 first_name 和 last_name 字段中。 你如何让它真正取代标准的 UserCreationForm?我创建了一个自定义用户 admin 并设置了 add_form = CustomUserCreationForm,但是当我在管理页面中添加用户时它不会显示。 对于 Meta 类,是否还需要包含密码字段?例如:fields = ("username", "fullname", "email", "password1", "password2")
?以上不包括密码1/密码2,所以我想确认一下。【参考方案2】:
你必须重写UserCreationForm.save()
方法:
def save(self, commit=True):
user = super(RegisterForm, self).save(commit=False)
user.fullname = self.cleaned_data["fullname"]
user.email = self.cleaned_data["email"]
if commit:
user.save()
return user
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/forms.py#L10
【讨论】:
【参考方案3】:在 django 1.10 中,我在 admin.py 中添加了 first_name、email 和 last_name到 默认 django 用户 创建表单
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib import admin
from django.contrib.auth.models import Group, User
# first unregister the existing useradmin...
admin.site.unregister(User)
class UserAdmin(BaseUserAdmin):
# The forms to add and change user instances
# The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
fieldsets = (
(None, 'fields': ('username', 'password')),
('Personal info', 'fields': ('first_name', 'last_name', 'email',)),
('Permissions', 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')),
('Important dates', 'fields': ('last_login', 'date_joined')),)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets = (
(None,
'classes': ('wide',),
'fields': ('username', 'email', 'first_name', 'last_name', 'password1', 'password2')),)
list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
search_fields = ('username', 'first_name', 'last_name', 'email')
ordering = ('username',)
filter_horizontal = ('groups', 'user_permissions',)
# Now register the new UserAdmin...
admin.site.register(User, UserAdmin)
【讨论】:
以上是关于Django 创建自定义 UserCreationForm的主要内容,如果未能解决你的问题,请参考以下文章