簡體   English   中英

自定義Django UserCreationForm,以便我根據姓氏和名字創建用戶名,而不是由用戶輸入?

[英]customizing Django UserCreationForm so that I create the username from lastname and firstname, not the user entering it?

我想修改我的UserCreationForm,以便當用戶請求注冊到我的網站時,他們得到的用戶名為last_name +'。'+ first_name。

我的djangoforms.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(),然后嘗試獲取cleaned_data first_name.last_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})

默認情況下,init上的UserCreationForm檢查表單字段中是否存在User模型的USERNAME_FIELD屬性,因此除非您已選擇另一個字段作為USERNAME_FIELD否則您不希望排除username屬性。

如果要使用用戶名作為USERNAME_FIELD,但又不想在前端顯示它,則可以使用{{ form.username.as_hidden }}類的模板語法將用戶名設置為隱藏在html中。

然后,您可以覆蓋SignUpFormsave方法,這將使您在表單有效后進行任何后期處理。

您也不需要在字段中添加password1password2 ,因為它們是繼承的。

如果您打算將username屬性設置為2的組合值,則應設置first_namelast_name為必需,否則當用戶不輸入其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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM