Django中UserCreationForm出现未知Password-based authentication字段:含义及移除方法
问题:注册表单出现未预期的「Password-based authentication」字段
我使用Django Forms创建了用户注册表单,运行代码后出现了一个未预期的Password-based authentication字段,我并未配置该字段,不清楚其含义,希望了解该字段是什么以及如何从注册表单中移除它。
form.py
from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.hashers import check_password class RegisterForm(UserCreationForm): """Form to Create new User""" def __init__(self, *args,hashed_code=None, **kwargs) -> None: super(RegisterForm,self).__init__(*args, **kwargs) self.hashed_code = hashed_code code = forms.CharField(max_length=4, required=True, label="code", help_text="Enter the four-digit code" ) def is_valid(self): """Return True if the form has no errors, or False otherwise.""" if not self.hashed_code: self.add_error("code","you have not any valid code get the code first") elif not check_password(self.data.get("code"),self.hashed_code) : self.add_error("code","code is invalid") return self.is_bound and not self.errors class Meta: model = get_user_model() fields = ["email", "password1", "password2","code"]
解答
这个字段是什么?
你看到的Password-based authentication并非代码中显式定义的字段,大概率是以下情况之一:
- 浏览器对密码输入区域的自动提示文本(部分浏览器会给密码字段组添加这类认证方式提示);
- 若使用了django-crispy-forms这类第三方表单渲染库,可能是库自动生成的密码字段分组标题;
- 极端情况是自定义用户模型中隐含的认证相关字段被表单自动包含,但从你的代码看,
Meta类已明确指定渲染字段,这种可能性极低。
如何移除它?
根据不同场景,你可以尝试以下方案:
1. 手动指定渲染字段(最可靠)
不要用{{ form }}自动渲染整个表单,而是手动渲染你需要的字段,确保只展示email、password1、password2和code:
<form method="post"> {% csrf_token %} <div> {{ form.email.label_tag }} {{ form.email }} {% if form.email.errors %} <span class="error">{{ form.email.errors }}</span> {% endif %} </div> <div> {{ form.password1.label_tag }} {{ form.password1 }} {% if form.password1.errors %} <span class="error">{{ form.password1.errors }}</span> {% endif %} </div> <div> {{ form.password2.label_tag }} {{ form.password2 }} {% if form.password2.errors %} <span class="error">{{ form.password2.errors }}</span> {% endif %} </div> <div> {{ form.code.label_tag }} {{ form.code }} {% if form.code.errors %} <span class="error">{{ form.code.errors }}</span> {% endif %} </div> <button type="submit">注册</button> </form>
2. 在表单初始化时强制移除字段
如果确实是表单被自动添加了这个字段,可在__init__方法中主动删除:
def __init__(self, *args, hashed_code=None, **kwargs) -> None: super(RegisterForm,self).__init__(*args, **kwargs) self.hashed_code = hashed_code # 移除未预期的字段 unwanted_field = 'password_based_authentication' if unwanted_field in self.fields: del self.fields[unwanted_field]
3. 检查第三方渲染库配置
若使用了django-crispy-forms这类库,检查表单布局配置,确保没有自动添加密码分组的标题,比如修改Layout定义,只包含需要的字段。
内容的提问来源于stack exchange,提问作者mehdi_ahmadi
相关产品推荐
相关产品推荐

