小编典典

使用Django auth UserAdmin创建自定义用户模型

django

扩展Django的默认用户 如果你对Django的用户模型完全满意,并且只想添加一些其他配置文件信息,则可以简单地子类化django.contrib.auth.models.AbstractUser并添加自定义配置文件字段。此类提供默认用户的完整实现,作为抽象模型。。我创建了一个新模型,如下所示:

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

这在admin中几乎像Django的standard一样显示User。但是,admin中最重要的区别是不存在password-(re)set字段,而是显示了普通的CharField。我真的必须重写admin-config中的内容才能使其正常工作吗?如果是这样,我怎么能以某种DRY的方式做到这一点(即,不从Django源中复制东西… eww …)?


阅读 1165

收藏
2020-03-31

共1个答案

小编典典

在研究Django源代码一段时间后,我发现了一个可行的灵魂。我对这种解决方案并不完全满意,但它似乎有效。欢迎提出更好的解决方案!

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

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)
2020-03-31