代码之家  ›  专栏  ›  技术社区  ›  trouselife

自定义Django UserCreationForm,以便从lastname和firstname创建用户名,而不是用户输入用户名?

  •  0
  • trouselife  · 技术社区  · 7 年前

    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>
    

    def signup(request):
        if request.method == 'POST':
    
            form = SignUpForm(request.POST)
    

    我试着在这里输入form.save(),然后用first\u name清除数据。last\u name=用户名,但它不起作用

            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})
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Sean Parsons    7 年前

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

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

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

    password1 password2 因为它们是继承的。

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

    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