簡體   English   中英

具有一個密碼的 Django UserCreationForm

[英]Django UserCreationForm with one password

我想知道是否可以在沒有密碼確認的情況下制作 UseCreationForm(只有 password1)。 我正在使用的代碼:

#forms.py
class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

#views.py
class HomeView(View):
    template_name = 'home.html'

    def get(self, request):
        queryset = Profile.objects.filter(verified=True)
        form = UserRegistrationForm()
        context = {
            'object_list': queryset,
            'form':form,
            'num_of_users': User.objects.all().count()
        }
        return render(request, self.template_name, context)

問題是,當我制作 forms.py 時:

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')

表單也有字段 password2。 有什么解決辦法嗎?

您可以覆蓋表單的__init__()方法並刪除所需的字段:

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        del self.fields['password2']

重要提示:無論如何,只有一個密碼字段並不是一種常見的做法,因為用戶可能會輸入錯誤。 並且安全級別降低了很多。

您的表單有兩個密碼字段的原因是因為您的表單從父類UserCreationForm繼承了兩個UserCreationForm

## Based on actual Django source code
class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(...)
    password2 = forms.CharField(...)

如果要刪除其中一個字段,只需在子類中將其設置為None

但是,在 Django 2.1 中,默認的UserCreationForm使用password2根據settings.AUTH_PASSWORD_VALIDATORS定義的站點范圍驗證器驗證密碼(來源: 鏈接

保留密碼驗證同時刪除password2一種簡單方法是設置password2 = None並定義clean_password1

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import password_validation

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')
    password2 = None

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')

    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        try:
            password_validation.validate_password(password1, self.instance)
        except forms.ValidationError as error:

            # Method inherited from BaseForm
            self.add_error('password1', error)
        return password1

您可以使用 None 值覆蓋“password2”。

class UserRegistrationForm(UserCreationForm):
    password2 = None

    class Meta:
        ...

暫無
暫無

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

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