在 Django 中自定义管理表单,同时使用自动发现

Posted

技术标签:

【中文标题】在 Django 中自定义管理表单,同时使用自动发现【英文标题】:Customizing an Admin form in Django while also using autodiscover 【发布时间】:2010-10-03 01:28:33 【问题描述】:

我想修改 Django 内置 django.contrib.auth 模块的一些小细节。具体来说,我想要一个不同的表单,使用户名成为电子邮件字段(并通过电子邮件发送备用电子邮件地址。(我宁愿不修改 auth 任何必要的 - 一个简单的表单更改 似乎是所有需要的。)

当我将autodiscoverauth 的自定义ModelAdmin 一起使用时,我最终会与auth 自己的管理界面发生冲突并出现“已注册”错误。

看来我必须创建自己的管理站点,枚举我的所有模型。它只有 18 个类,但似乎是一个 DRY 问题——每次更改都需要添加到模型添加到自定义管理站点。

或者,我是否应该编写自己的“autodiscover with excludes”版本来基本上导入所有admin 模块除了 auth

【问题讨论】:

【参考方案1】:

以上都不是。只需使用 admin.site.unregister()。这是我最近在管理员中添加过滤用户 is_active 的方法(nb is_active 过滤现在默认在 Django 核心中的用户模型上;仍然作为示例在这里工作),所有 DRY 都可以:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    list_filter = UserAdmin.list_filter + ('is_active',)

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

【讨论】:

Sweet -- 完全错过了sites.AdminSite中的注销方法 有趣。感谢分享,卡尔。 我注意到,在将这个 unregister() 调用添加到我的代码之后,我必须在 Django “看到”我所做的更改之前手动终止并重新启动我的开发服务器。这让我浪费了 15 分钟试图弄清楚为什么 unregister() 不起作用。这最终把我带到了这个 Stack Overflow 问题,在那里我发现我正在做的事情应该起作用。 :-) @Brandon 是的,一般来说,Django 的 admin.py 自动发现不能很好地配合开发服务器自动重新加载。如果您在 admin.py 中有语法错误,这也会给您带来麻烦;修复后,错误将消失,但该应用程序将完全从管理员中丢失,直到您手动重新启动开发服务器。令人恼火,但我还没有深入寻找错误。 @thumbtackthief 因为 Django 不允许你注册同一个模型两次,并且用户已经被 contrib.auth 注册到它的 UserAdmin 类中。所以你必须先注销它,然后才能用你自己的 ModelAdmin 子类注册它。【参考方案2】:

我认为使用自定义身份验证后端执行此操作可能更容易,因此无需自定义 ModelAdmin。

我对这个 sn-p 做了类似的事情: http://www.djangosnippets.org/snippets/74/

【讨论】:

其实我需要增强的后端和前端。我需要将用户名设置为电子邮件地址,以便“@domain”确保它们是唯一的。我已经在使用你的 sn-p。但将其作为此答案集的一部分会有所帮助。

以上是关于在 Django 中自定义管理表单,同时使用自动发现的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django admin 中自定义多对多内联模型

Django:如何在管理表单中获取当前用户?

如何在 Django 中自定义单选按钮

如何在 Django 1.7 中自定义管理页面?

如何在 Django CRUD 中自定义 auth.User 管理页面?

如何在 django 中自定义数据库连接设置的时区?