带有一个密码的Django UserCreationForm

Bar*_*rka 6 python django python-3.x

我想知道是否可以在没有密码确认(仅password1)的情况下使用UseCreationForm。我正在使用的代码:

#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)
Run Code Online (Sandbox Code Playgroud)

问题是,当我这样创建form.py时:

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

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')
Run Code Online (Sandbox Code Playgroud)

表单还具有字段password2。有什么解决办法吗?

wen*_*isa 6

您可以覆盖__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']
Run Code Online (Sandbox Code Playgroud)

重要提示:无论如何,只有一个密码字段是不常见的做法,因为用户可以输入错误的密码。而且安全级别降低了很多。


tou*_*ody 5

您的表单有两个密码字段的原因是因为您的表单从父类继承了两个字段UserCreationForm

## Based on actual Django source code
class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(...)
    password2 = forms.CharField(...)
Run Code Online (Sandbox Code Playgroud)

如果您想删除其中一个字段,您只需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
Run Code Online (Sandbox Code Playgroud)