我想修改我的 UserCreationForm,这样当用户请求注册我的网站时,他们得到的用户名是 last_name+'.'+first_name。
我的 Django 表单.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>
在我的 views.py 中:
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
我试过把 form.save() 放在这里,然后尝试获取clean_data first_name.last_name = username,但它不起作用
if form.is_valid():
form.save()
first_name = form.cleaned_data.get('first_name')
last_name = form.cleaned_data.get('last_name')
raw_password = form.cleaned_data.get('password1')
#username = form.cleaned_data.get('username')
username = firstname+'.'+lastname
user = authenticate(username=username, password=raw_password)
user.is_active = False
user.save()
return render(request, 'registration/signedup.html', {'user': user})
else:
return render(request, 'registration/signup.html', {'form': form, 'invalid': 'Please try again.'})
else:
form = SignUpForm()
return render(request, 'registration/signup.html', {'form': form})
默认情况下,UserCreationForm
on init 检查USERNAME_FIELD
表单字段中是否存在User 模型属性,因此您不想排除该username
属性,除非您选择了另一个字段作为USERNAME_FIELD
.
如果您想使用用户名作为 USERNAME_FIELD 但不希望它显示在前端,您可以使用模板语法将其设置为隐藏在您的 html 中,例如 {{ form.username.as_hidden }}
然后,您可以覆盖 的save
方法SignUpForm
,这将允许您在表单有效后进行任何后期处理。
您也不需要将password1
和添加password2
到字段,因为它们是继承的。
如果您打算将属性设置为2 的组合值,则应该将first_name
和last_name
设置为必需username
,否则当用户不输入他们的名字和姓氏时,我在下面提供的代码将不起作用。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句