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

扩展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 …)?

回答:

在研究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)

以上是 使用Django auth UserAdmin创建自定义用户模型 的全部内容, 来源链接: utcz.com/qa/432542.html

回到顶部