django - Django:UserCreationForm 没有得到自定义用户类
问题描述
我是 Django 新手,遇到了一个奇怪的问题。使用 Django 2.2.5,我创建了一个自定义 User 类,从AbstractBaseUser
. 除了扩展AbstractBaseUser
我所做的唯一重大更改之外,我还删除了该username
字段并添加了我自己的字段(这里不解释原因)。我也将其添加USERNAME_FIELD = "my new username"
到模型中。
这一切似乎都运作良好,我能够创建用户。然后我安装了django-registration
, 以使用该功能,当我尝试时makemigrations
遇到了这个错误:
'django.core.exceptions.FieldError: Unknown field(s) ("My new username") specified for User`
现在,这对我来说没有任何意义,因为模型显然有一个“我的新用户名”字段,并且我指定 Django 应该在设置中使用我的 User 模型 via AUTH_USER_MODEL
。我知道这是可行的,因为调用get_user_model()
shell 返回了我的自定义模型。
现在这里变得很奇怪,我能够将问题追溯到django-registrations
, RegistrationForm
。这是 Django 的子类形式UserCreationForm
。当 RgistrationForm 正在加载或在makemigrations
它产生错误的过程中,因为表单的模型引用django.User
不是我的自定义用户模型。 RegistrationForm
不声明模型并使用UserCreationForm
恰好User
来自的模型django.contrib.auth.models
。
根据我所阅读的内容和User
编写方式,它应该通过swappable
我设置的属性引用我的模型,AUTH_USER_MODEL
并且它应该交换到位于该设置选项中的模型。出于某种原因,虽然它不起作用,而且我对 Django 的了解还不够,无法进一步调试。
我对此感到非常困惑,因为get_user_model()
引用了完全相同的设置并且它有效。
我暂时可以通过编辑RegistrationForm
模型以添加model = "Custom user model
django-registration 的表单来解决这个问题。我宁愿现在不必与站点的其余部分一起分发此软件包的自定义版本。
知道发生了什么swappable
可能导致此问题吗?
2019 年 1 月 27 日编辑:更新我尝试对相关django-registration
类进行子分类,但事实证明,简单的导入RegistrationForm
会导致问题。导入UserCreationForm
不会立即导致问题,但如果我尝试检查UserCreationForm.Meta.model."My new username"
它会提供此错误:
AttributeError:类型对象“用户”没有属性“UVI_Handle”
这与上面的错误一致。在这一点上,我不确定如何再次进行。我可以 subclass UserCreationForm
,但没有人django-registration
会接受它,所以使用它似乎没有意义,因为我必须复制整个东西。
解决方案
您应该继承子类,而不是更改包代码:
在您的用户模型与 django-registration 的默认行为兼容的情况下,(见下文)您将能够继承 RegistrationForm,将其设置为使用您的自定义用户模型作为模型,然后在 django- 中配置视图-注册以使用您的表单子类。例如,您可能会执行以下操作(在代码库中某处的 forms.py 模块中 - 不要直接编辑 django-registration 的代码):
from registration.forms import RegistrationForm
from mycustomuserapp.models import MyCustomUser
class MyCustomUserForm(RegistrationForm):
class Meta:
model = MyCustomUser
以上取自这里,您还应该更改网址,那里也有描述。
推荐阅读
- python - Python Requests_html:给我超时错误
- javascript - 在 browser.call() 方法中失败的期望不会失败测试
- powerbi - 如何在 DAX 公式中引用前一个过滤行中的值?
- rcpp - 访问列表列表中的元素 (Rccp)
- vue.js - 特定 node_module 的 Webpack 别名“@”
- java - 将xml转换为json时如何区分字符串“null”和null值?
- terraform - Terraform 通过命令行启用特定的虚拟机
- django - 使用 Django 表单集创建用户列表页面并在用户列表页面中显示个人资料图像
- asp.net - 在 .NET Framework 4.7.2 中使用多个环境
- node.js - RabbitMQ 队列未被多个消费者服务并行消费