在 Django 中自定义管理表单,同时使用自动发现
Posted
技术标签:
【中文标题】在 Django 中自定义管理表单,同时使用自动发现【英文标题】:Customizing an Admin form in Django while also using autodiscover 【发布时间】:2010-10-03 01:28:33 【问题描述】:我想修改 Django 内置 django.contrib.auth
模块的一些小细节。具体来说,我想要一个不同的表单,使用户名成为电子邮件字段(并通过电子邮件发送备用电子邮件地址。(我宁愿不修改 auth
任何必要的 - 一个简单的表单更改 似乎是所有需要的。)
当我将autodiscover
与auth
的自定义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 中自定义管理表单,同时使用自动发现的主要内容,如果未能解决你的问题,请参考以下文章