2011-04-21 138 views
13

我启用了Django中的用户认证模块,但是当我使用UserCreationForm时,他只问我用户名和两个密码/密码确认字段。我还需要电子邮件和全名字段,并设置为必填字段。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",) 

现在的形式显示新的领域,但它并没有将它们保存在数据库中。

我该如何解决?

回答

18

有没有这样的场称为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所说的并覆盖保存方法,但是由于用户模型没有全名字段,它应该看起来像这样:

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 

注意:您应该为fullname字段添加一个干净的方法,以确保输入的完整名称只包含两个部分,即名和姓,并且具有其他有效的字符。

参考源代码的用户模型:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py#L201 
+0

好回答老兄。我不关心数据库中的'full_name'字段,但是我可以编辑注册表单来询问不是名字和姓氏,而是一个字段的全名吗? – 2011-04-21 14:54:20

+0

我不太确定我是否遵循...你的意思是你想在全名中只有一个字段,但你不在乎它是否被保存了?还是你问如何有一个全名字段,并仍然能够使用用户模型保存它? – chandsie 2011-04-21 14:54:55

+0

我希望在表单中有一个名为“全名”的字段,但我想将其保存在用户模型的全名字段中。如果我不能,请将fullname字段拆分以保存在模型的first_name和last_name字段中。 – 2011-04-21 14:59:17

4

我只是签署了在计算器上的帐户,因此缺乏直接回复chands'答案所需的点。但是,要小心下面的一行代码:

first_name, last_name = self.cleaned_data["fullname"].split() 

这就提出了“ValueError异常:值过多解压”如果全名是一样的东西“富酒吧巴兹”(如空白的两个实例,如果你的用户有中间名字)。我使用了一些细微的变体,它将最初的空白后的所有内容填充到last_name中。

first_name, last_name = self.cleaned_data["fullname"].split(None, 1) 
2

Django的1.10这是我在admin.py写道添加FIRST_NAME电子邮件LAST_NAMEDjango缺省的用户创作形式

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)