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_nameemaillast_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的主要内容,如果未能解决你的问题,请参考以下文章

Django 自定义用户创建未在管理站点中显示自定义字段

为 Django 创建自定义管理主题 [关闭]

Django 创建自定义 UserCreationForm

Django 创建自定义 UserCreationForm

如何在 django 中从组创建自定义组

Django REST Framework 创建自定义用户