【问题标题】:customizing Django UserCreationForm so that I create the username from lastname and firstname, not the user entering it?自定义 Django UserCreationForm 以便我从姓氏和名字创建用户名,而不是用户输入它?
【发布时间】:2017-07-12 14:07:03
【问题描述】:

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

我的 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>

在我看来.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})

【问题讨论】:

  • 您遇到任何错误吗?
  • 我的用户名是 Nonetype at: username = form.cleaned_data.get('username')
  • 在我看来,您需要执行 form.save() 才能将 form.cleaned_data 取出 - 但您无法保存表单,因为用户名是 None - 所以我需要以某种方式编辑 form_save() 但是我不知道该怎么办
  • 现在有什么问题??显然用户名将是无,因为您已从表单中排除该字段
  • 我希望不输入用户名,但要在表单中输入名字和姓氏。然后我希望用户名自动分配给last_name.firstname。例如,John Smith 通过此表单请求访问。他在 first_name 框中输入 John,在 last_name 框中输入 Smith,然后是他的密码和电子邮件。然后他的用户名自动变成 smith.john。问题是您似乎需要用户名值来保存表单,这就是您获取 first_name 和 last_name 值的方式

标签: python django forms authentication


【解决方案1】:

默认情况下,初始化时 UserCreationForm 会检查用户模型 USERNAME_FIELD 属性是否存在于表单字段中,因此您不想排除 username 属性,除非您选择了另一个字段作为您的 @987654324 @。

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

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

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

如果您计划将 username 属性设置为 2 的组合值,则应将 first_namelast_name 设置为必需,否则当用户不使用时,我在下面提供的代码将不起作用'T 输入他们的名字和姓氏。

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

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 2010-11-25
    • 2023-04-03
    • 1970-01-01
    • 2013-03-24
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多