自定义 Django UserCreationForm 以便我从姓氏和名字创建用户名,而不是用户输入它?

裤子生活

我想修改我的 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})
肖恩·帕森斯

默认情况下,UserCreationFormon init 检查USERNAME_FIELD表单字段中是否存在User 模型属性,因此您不想排除该username属性,除非您选择了另一个字段作为USERNAME_FIELD.

如果您想使用用户名作为 USERNAME_FIELD 但不希望它显示在前端,您可以使用模板语法将其设置为隐藏在您的 html 中,例如 {{ form.username.as_hidden }}

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

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

如果您打算将属性设置为2 的组合值,则应该将first_namelast_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django UserCreationForm自定义字段

Django自定义注册:如何设置默认密码并使用名字+姓氏作为用户名

继承自“UserCreationForm”的django自定义注册表单

在Django中访问自定义UserCreationForm的其他字段

Django1.11 自定义 UserCreationForm 过滤邮件

从UserCreationForm中删除用户名,并根据电子邮件,名字和姓氏自动为用户生成用户名

在Django中自定义用户名和密码字段?

Django自定义用户模型

Django(1.6)自定义用户模型

如何自定义 Django 用户模型?

Django自定义用户错误

Django自定义用户管理页面

自定义 Django 用户模型

Django使用Django Rest框架创建自定义用户

Django错误admin.E033:用户名不是users.CustomUser的属性。为什么我的自定义用户管理员不起作用?

Django 的 ListView - 如何自定义它

Django自定义用户模型引发SystemCheckError-字段“用户名”与名称“用户名”冲突

请求从django自定义命令输入?

Django创建自定义模型字段

如何创建Django自定义查询?

django创建自定义表单

在Django中创建自定义命令

Django 创建自定义表单权限

Django 自定义保存和更新

Django REST-完整用户名的自定义序列化程序

如何在自定义UserChangeForm中覆盖用户名的django'unique'错误消息

JWT:如何在密码或用户名上实现我的自定义错误消息是错误的 Django REST

Django rest 自定义用户模型创建失败

使用Django auth UserAdmin创建自定义用户模型