Skip to main content
 首页 » 编程设计

python之Django 密码验证不起作用

2025年05月04日29webabcd

我正在使用我自己的自定义用户模型,但我继承了 django.contrib.auth 用户模型。我有一个用户名、电子邮件和密码字段。我没有明确添加密码字段,因为默认情况下它是由继承添加的。当我尝试通过命令行创建 super 用户时,正常的默认 Django 密码验证工作正常。但是,当我有注册表单时,却没有。当我点击提交时,电子邮件和用户名验证工作正常,但没有密码验证。我可以输入我想要的任何内容,它会接受密码。

这是我的forms.py

class RegisterForm(forms.ModelForm): 
    class Meta: 
        model = User 
        fields = ['username', 'email', 'password'] 
 
    username    = forms.CharField(label='Username', widget=forms.TextInput(attrs={'placeholder': 'Username:'})) 
    email       = forms.EmailField(label='Email', widget=forms.EmailInput(attrs={'placeholder': 'Email:'})) 
    password    = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'placeholder': 'Password:'})) 

这是我的观点:

class RegisterView(SuccessMessageMixin, View): 
    form_class = RegisterForm 
    template_name = 'oauth/auth_form.html' 
    success_message = "You have successfully created an account!" 
 
    # Display blank form 
    def get(self, request): 
        form = self.form_class(None) 
        return render(request, self.template_name, {'form': form}) 
 
    def post(self, request): 
        form = self.form_class(request.POST) 
 
        if form.is_valid(): 
            user = form.save(commit=False) # Do not save to table yet 
 
            username = form.cleaned_data['username'] 
            password = form.cleaned_data['password'] 
 
            user.set_password(password) 
            user.save() 
 
            # Let's try to login the user 
            user = authenticate(username=username, password=password) 
 
            if user is not None: 
 
                    login(request, user) 
                    return redirect('profiles: index') 
 
        return render(request, self.template_name, {'form': form}) 

如何使用 Django 的默认密码验证来正确验证密码字段?

请您参考如下方法:

Django 对 integrate password validation 有一些实用程序.最简单的方法是在表单的字段特定 clean_password 方法中调用 validate_password 函数,但由于您需要一些验证器的用户实例,我将在观点:

from django.contrib.auth.password_validation import validate_password 
from django.core.exceptions import ValidationError 
 
class RegisterView(SuccessMessageMixin, View): 
    # ... 
    def post(self, request): 
 
        if form.is_valid(): 
            user = form.save(commit=False) # Do not save to table yet 
            username = form.cleaned_data['username'] 
            password = form.cleaned_data['password'] 
 
            try: 
                validate_password(password, user) 
            except ValidationError as e: 
                form.add_error('password', e)  # to be displayed with the field's errors 
                return render(request, self.template_name, {'form': form}) 
            # ... 
 
        return render(request, self.template_name, {'form': form})