Django创建自定义用户创建窗体

2024-06-30 16:00:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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", )

现在,表单显示了新字段,但没有将它们保存到数据库中。

我该怎么解决?


Tags: django用户fromimportauth密码emailforms
3条回答

我刚刚在StackOverflow上注册了一个帐户,因此没有必要直接回复chands的答案。但是,请注意以下代码行:

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

如果全名类似于“Foo Bar Baz”,则会引发“ValueError:too many values to unpack”(例如,如果用户有中间名,则会出现两个空格实例)。我使用了一个微小的变化,将初始空白后的所有内容填充到姓氏中。

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

用户模型中没有名为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方法,但是由于用户模型没有全名字段,因此它应该如下所示:

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

必须重写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

相关问题 更多 >