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
相关产品推荐
相关产品推荐

