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

Django自定义用户模型:管理员添加用户表单隐藏密码字段问题

解决密码字段无法隐藏的问题

问题核心在于你继承的UserCreationForm——这个表单本身就显式定义了password1和password2字段,不管你在Meta的fields里怎么设置,这两个字段都会被强制渲染出来。要彻底隐藏密码字段,得换个思路处理:

步骤1:修改表单,改用ModelForm继承

把AddCompanyEmployeeForm改成直接继承ModelForm,摆脱UserCreationForm自带的密码字段逻辑:

from django import forms
from .models import CustomUser
from django.utils.crypto import get_random_string

class AddCompanyEmployeeForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ('email', 'full_name', 'age', 'employee_type', 'employee_start_date')  # 根据需求调整字段

    def save(self, commit=True):
        # 生成安全随机密码并设置给用户
        user = super().save(commit=False)
        random_password = get_random_string(length=12)
        user.set_password(random_password)
        if commit:
            user.save()
        return user

步骤2:在视图中添加密码重置邮件发送逻辑

要给新用户发送密码重置链接,可以利用Django内置的密码重置token生成工具,在表单保存成功后触发邮件发送:

from django.contrib.auth.tokens import default_token_generator
from django.core.mail import send_mail
from django.urls import reverse
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.views.generic import CreateView
from .forms import AddCompanyEmployeeForm
from .models import CustomUser

class AddCompanyEmployee(CreateView):
    model = CustomUser
    template_name = 'manage/add_employee.html'
    form_class = AddCompanyEmployeeForm

    def get_success_url(self):
        return reverse('userprofile_detail', kwargs={'pk': self.object.userprofile.pk})

    def form_valid(self, form):
        response = super().form_valid(form)
        user = self.object
        # 生成密码重置所需的uid和token
        uid = urlsafe_base64_encode(force_bytes(user.pk))
        token = default_token_generator.make_token(user)
        reset_url = reverse('password_reset_confirm', kwargs={'uidb64': uid, 'token': token})
        # 拼接完整重置链接(生产环境需替换为实际域名)
        full_reset_url = f"{self.request.scheme}://{self.request.get_host()}{reset_url}"
        
        # 发送邮件
        send_mail(
            '你的企业账户已创建,请重置密码',
            f'点击下方链接设置你的账户密码:\n{full_reset_url}',
            'admin@yourcompany.com',
            [user.email],
            fail_silently=False,
        )
        return response

关键说明

  • 之前修改fields无效的原因:UserCreationForm的构造方法会主动添加密码字段,不受Meta配置的fields约束,所以必须替换为ModelForm。
  • 用get_random_string生成密码是Django官方推荐的安全方式,避免手动生成弱密码。
  • 发送邮件前需在settings.py中配置好邮件服务参数(如EMAIL_BACKEND、EMAIL_HOST等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:05:25