首页 > 解决方案 > 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 modeldjango-registration 的表单来解决这个问题。我宁愿现在不必与站点的其余部分一起分发此软件包的自定义版本。

知道发生了什么swappable可能导致此问题吗?

2019 年 1 月 27 日编辑:更新我尝试对相关django-registration类进行子分类,但事实证明,简单的导入RegistrationForm会导致问题。导入UserCreationForm不会立即导致问题,但如果我尝试检查UserCreationForm.Meta.model."My new username"它会提供此错误:

AttributeError:类型对象“用户”没有属性“UVI_Handle”

这与上面的错误一致。在这一点上,我不确定如何再次进行。我可以 subclass UserCreationForm,但没有人django-registration会接受它,所以使用它似乎没有意义,因为我必须复制整个东西。

标签: djangopython-3.xdjango-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

以上取自这里,您还应该更改网址,那里也有描述。


推荐阅读