来自Django.Contrib.Auth 文档:
扩展 Django 的默认用户如果您对 Django 的 User 模型完全满意,并且只想添加一些额外的个人资料信息,您可以简单地子类化django.contrib.auth.models.AbstractUser
并添加您的自定义配置文件字段。此类提供默认 User 作为抽象模型的完整实现。
说了又做了。我创建了一个如下所示的新模型:
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
这几乎像 Django 的标准一样显示在管理中User
。然而,admin 中最重要的区别是密码(重新)设置字段不存在,而是显示普通的 CharField。我真的必须覆盖管理配置中的内容才能使其正常工作吗?如果是这样,我怎样才能以某种干燥的方式做到这一点(即不从 Django 源代码复制内容......呃......)?
在深入研究 Django 源代码一段时间后,我找到了一个可行的解决方案。我对这个解决方案并不完全满意,但它似乎有效。欢迎提出更好的解决方案!
Django 使用UserAdmin
呈现良好的管理员外观User
模型。只需在我们的admin.py
-file,我们可以为我们的模型获得相同的外观。
from django.contrib.auth.admin import UserAdmin
admin.site.register(MyUser, UserAdmin)
然而,仅此可能不是一个好的解决方案,因为 Django Admin 不会显示任何特殊字段。有两个原因:
-
UserAdmin
uses 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)