Python 定制Django UserCreationForm,以便我从lastname和firstname创建用户名,而不是输入用户名的用户?

Python 定制Django UserCreationForm,以便我从lastname和firstname创建用户名,而不是输入用户名的用户?,python,django,forms,authentication,Python,Django,Forms,Authentication,我想修改我的UserCreationForm,这样当用户请求注册我的网站时,他们会得到一个last_name+'。+first_name的用户名 my django forms.py: from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User class SignUpForm(UserCreationFo

我想修改我的UserCreationForm,这样当用户请求注册我的网站时,他们会得到一个last_name+'。+first_name的用户名

my django forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False)
    last_name = forms.CharField(max_length=30, required=False)
    email = forms.EmailField(max_length=254)


    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password1', 'password2', )
        exclude = ['username', ]
因此,我已将用户名从实际表单中排除:

<h2>Sign up</h2>
<form method="post">
 {% csrf_token %}
 {% for field in form %}
   <p>
     {{ field.label_tag }}<br>
     {{ field }}
     {% if field.help_text %}
       <small style="color: grey">{{ field.help_text }}</small>
     {% endif %}
     {% for error in field.errors %}
       <p style="color: red">{{ error }}</p>
     {% endfor %}
   </p>
 {% endfor %}
 <button type="submit">Sign up</button>
</form>
我尝试在此处输入form.save(),然后尝试先清除数据\u name.last\u name=username,但它不起作用


默认情况下,init上的
UserCreationForm
检查表单字段中是否存在用户模型
USERNAME\u字段
属性,因此除非您选择了另一个字段作为
USERNAME\u字段
,否则您不想排除
USERNAME属性

如果您想使用username作为username_字段,但不想在前端显示,可以使用模板语法将其设置为隐藏在html中,如
{{form.username.as_hidden}

然后,您可以覆盖
SignUpForm
save
方法,这将允许您在表单有效后执行任何后期处理

您也不需要将
password1
password2
添加到字段中,因为它们是继承的

如果您计划将
username
属性设置为2的组合值,则应将
first\u name
last\u name
设置为必填项,否则当用户不输入其first\u name和last\u name时,我在下面提供的代码将不起作用

class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False)
    last_name = forms.CharField(max_length=30, required=False)
    email = forms.EmailField(max_length=254)


    class Meta:
        model = User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        user.username = '{}.{}'.format(
            self.cleaned_data['last_name'],
            self.cleaned_data['first_name']
        )
        if commit:
            user.save()
        return user

默认情况下,init上的
UserCreationForm
检查表单字段中是否存在用户模型
USERNAME\u字段
属性,因此除非您选择了另一个字段作为
USERNAME\u字段
,否则您不想排除
USERNAME属性

如果您想使用username作为username_字段,但不想在前端显示,可以使用模板语法将其设置为隐藏在html中,如
{{form.username.as_hidden}

然后,您可以覆盖
SignUpForm
save
方法,这将允许您在表单有效后执行任何后期处理

您也不需要将
password1
password2
添加到字段中,因为它们是继承的

如果您计划将
username
属性设置为2的组合值,则应将
first\u name
last\u name
设置为必填项,否则当用户不输入其first\u name和last\u name时,我在下面提供的代码将不起作用

class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False)
    last_name = forms.CharField(max_length=30, required=False)
    email = forms.EmailField(max_length=254)


    class Meta:
        model = User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        user.username = '{}.{}'.format(
            self.cleaned_data['last_name'],
            self.cleaned_data['first_name']
        )
        if commit:
            user.save()
        return user

你有什么错误吗?我的用户名是Nonetype:username=form.cleaned_data.get('username')在我看来,你需要执行form.save()来获取form.cleaned_data-但是你不能保存表单,因为username是None-所以我需要以某种方式编辑form_save(),但我不知道现在该做什么??显然,用户名将为none,因为您已将该字段从formI中排除。我不希望输入用户名,但希望在表单中输入名字和姓氏。然后我希望用户名自动分配给last_name.firstname。例如,John Smith通过此表单请求访问。他将约翰输入名字框,史密斯输入姓氏框,然后输入密码和电子邮件。然后他的用户名自动变成smith.john。问题是你似乎需要用户名值来保存表单,这就是你如何获取名字和姓氏值的方法。你得到了什么错误?我的用户名是Nonetype at:username=form.cleaned\u data.get('username')在我看来,你需要执行form.save()要获取form.cleaned_数据-但您无法保存表单,因为用户名为None-因此我需要以某种方式编辑form_save(),但我不知道要做什么现在出现了什么问题??显然,用户名将为none,因为您已将该字段从formI中排除。我不希望输入用户名,但希望在表单中输入名字和姓氏。然后我希望用户名自动分配给last_name.firstname。例如,John Smith通过此表单请求访问。他将约翰输入名字框,史密斯输入姓氏框,然后输入密码和电子邮件。然后他的用户名自动变成smith.john。问题是,您似乎需要用户名值来保存表单,这就是如何获取first_name和last_name值的方法
class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False)
    last_name = forms.CharField(max_length=30, required=False)
    email = forms.EmailField(max_length=254)


    class Meta:
        model = User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        user.username = '{}.{}'.format(
            self.cleaned_data['last_name'],
            self.cleaned_data['first_name']
        )
        if commit:
            user.save()
        return user