gpt4 book ai didi

django - 将 Django auth UserAdmin 用于自定义用户模型

转载 作者:行者123 更新时间:2023-11-28 19:33:13 28 4
gpt4 key购买 nike

来自Django.Contrib.Auth docs :

Extending Django’s default User If you’re entirely happy with Django’s User model and you just want to add some additional profile information, you can simply subclass django.contrib.auth.models.AbstractUser and add your custom profile fields. This class provides the full implementation of the default User as an abstract model.

说完了。我创建了一个如下所示的新模型:

class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)

这几乎像 Django 的标准 User 一样显示在管理中。但是,admin 中最重要的区别是不存在密码(重新)设置字段,而是显示普通的 CharField。我真的必须覆盖管理配置中的东西才能让它工作吗?如果是这样,我怎样才能以某种 DRY 方式做到这一点(即不从 Django 源代码复制内容......呃......)?

最佳答案

在对 Django 源代码进行了一段时间的挖掘之后,我找到了一个可行的解决方案。我对这个解决方案不是很满意,但它似乎有效。欢迎提出更好的解决方案!


Django 使用 UserAdminUser 模型呈现漂亮的管理员外观。通过在我们的 admin.py 文件中使用它,我们可以获得相同的模型外观。

from django.contrib.auth.admin import UserAdmin
admin.site.register(MyUser, UserAdmin)

但是,仅此一项可能不是一个好的解决方案,因为 Django Admin 不会显示您的任何特殊字段。这有两个原因:

  • UserAdmin 使用 UserChangeForm 作为修改对象时要使用的表单,而对象又使用 User 作为其模型。<
  • UserAdmin 定义了一个 formsets 属性,稍后由 UserChangeForm 使用,它不包括您的特殊字段。

因此,我创建了一个特殊的更改表单,它重载了 Meta 内部类,以便更改表单使用正确的模型。我还必须重载 UserAdmin 以将我的特殊字段添加到字段集中,这是我有点不喜欢的解决方案的一部分,因为它看起来有点难看。欢迎提出改进建议!

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = MyUser

class MyUserAdmin(UserAdmin):
form = MyUserChangeForm

fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('some_extra_data',)}),
)


admin.site.register(MyUser, MyUserAdmin)

关于django - 将 Django auth UserAdmin 用于自定义用户模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15012235/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com