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

Django实现用户名作为初始密码并要求后续修改的问题求助

代码调整方案

1. 修正模型的save方法

Django存储用户密码需要使用哈希值,不能直接赋值明文,必须用set_password()方法处理。同时要添加判断,仅在创建新用户时设置初始密码,避免后续修改用户信息时重置密码:

class Profile(AbstractUser):
    codemeli = models.CharField(
        max_length=10, verbose_name='کد ملی', unique=True)
    fname_en = models.CharField(
        max_length=150, verbose_name='نام لاتین', null=True, blank=True)
    lname_en = models.CharField(
        max_length=150, verbose_name='='نام خانوادگی لاتین', null=True, blank=True)

    def save(self, *args, **kwargs):
        # 仅新用户创建时设置初始密码
        if not self.pk:
            self.set_password(self.username)
        super().save(*args, **kwargs)

2. 修改表单类

原表单继承UserCreationForm会默认生成密码输入字段,我们不需要用户输入密码,所以改为继承ModelForm,彻底移除密码相关字段:

from django.forms import ModelForm

class CreateUserForm(ModelForm):
    class Meta:
        model = Profile
        fields = [
            'username',
            'codemeli',
            'first_name',
            'last_name',
        ]

如果必须保留UserCreationForm,可以通过重写__init__方法删除密码字段:

class CreateUserForm(UserCreationForm):
    class Meta:
        model = Profile
        fields = [
            'username',
            'codemeli',
            'first_name',
            'last_name',
        ]

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

3. 视图优化(可选)

如果是普通用户注册场景,需要移除@login_required装饰器,允许未登录用户访问;同时表单验证失败时,返回表单页面显示错误信息,而不是直接重定向:

# 普通用户注册场景移除@login_required
def member_create(request):
    if request.method == "POST":
        form = CreateUserForm(request.POST)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.INFO, '用户创建成功,请使用用户名作为初始密码登录,登录后请及时修改密码')
            return redirect("member_index")
        else:
            messages.add_message(request, messages.warning, '表单输入有误,请检查')
    else:
        form = CreateUserForm()

    context = {'form': form}
    return render(request, 'member/register.html', context)

关键说明

  • 必须用set_password():Django用户系统依赖哈希密码存储,直接赋值明文会导致用户无法登录。
  • 新用户判断逻辑:if not self.pk:确保只有首次创建用户时设置初始密码,不影响后续用户自行修改密码的操作。
  • 移除密码字段:避免用户输入密码,完全符合“初始密码与用户名相同”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:24:57