Python 定制Django UserCreationForm,以便我从lastname和firstname创建用户名,而不是输入用户名的用户?
我想修改我的UserCreationForm,这样当用户请求注册我的网站时,他们会得到一个last_name+'。+first_name的用户名 my django forms.py: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
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