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

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

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

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

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

【问题讨论】:

    标签: python django forms django-admin customization


    【解决方案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。但将其作为此答案集的一部分会有所帮助。
    猜你喜欢
    • 2013-08-26
    • 2019-11-30
    • 2019-08-07
    • 2012-12-10
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多