You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义AbstractBaseUser后表单创建用户密码未哈希问题求助

解决Django自定义用户表单创建时密码未哈希的问题

问题根源:通过表单创建用户时,默认的ModelForm.save()会直接将密码明文存入数据库,没有调用set_password()方法进行哈希处理;而终端创建用户时使用的是自定义BaseUserManager中的create_user方法,该方法内部已经调用了set_password(),所以能正常哈希。

下面提供两种可行的解决方法:

方法一:在视图中使用自定义Manager创建用户

修改视图代码,不直接调用表单的save(),而是提取表单验证后的字段,通过MyUser.objects.create_user()创建用户:

# views.py示例代码
from django.shortcuts import render, redirect
from .forms import MyUserForm

def create_user(request):
    if request.method == 'POST':
        form = MyUserForm(request.POST)
        if form.is_valid():
            # 提取表单清理后的数据
            email = form.cleaned_data['email']
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            password = form.cleaned_data['password']
            # 使用自定义Manager的create_user方法创建用户
            user = MyUser.objects.create_user(email, first_name, last_name, password)
            # 如果需要设置其他字段(比如is_active),可以在这里补充
            # user.is_active = True
            # user.save()
            return redirect('success_page')
    else:
        form = MyUserForm()
    return render(request, 'create_user.html', {'form': form})

方法二:重写表单的save方法

在MyUserForm中重写save()方法,在保存用户前调用set_password()处理密码:

# forms.py修改后的代码
from django import forms
from .models import MyUser

class MyUserForm(forms.ModelForm):
    email = forms.CharField(widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Email', 'autocomplete': 'off', 'style': 'margin-top: 0.4em; margin-bottom: 1em'}))
    first_name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First name', 'autocomplete': 'off', 'style': 'margin-top: 0.4em; margin-bottom: 1em'}))
    last_name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last name', 'autocomplete': 'off', 'style': 'margin-top: 0.4em; margin-bottom: 1em'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password', 'autocomplete': 'off', 'style': 'margin-top: 0.4em; margin-bottom: 1em'}))
    
    class Meta:
        model = MyUser
        fields = ['email', 'first_name', 'last_name', 'password']

    def save(self, commit=True):
        # 先不提交到数据库
        user = super().save(commit=False)
        # 对密码进行哈希处理
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

两种方法都能解决密码未哈希的问题,推荐第二种方法,因为表单逻辑更内聚,视图代码更简洁。

内容的提问来源于stack exchange,提问作者DR4NKR1D3R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:31:03