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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:04:55