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

Python 在Django中自定义管理表单,同时使用自动发现,python,django,forms,django-admin,customization,Python,Django,Forms,Django Admin,Customization,我想修改Django内置的Django.contrib.auth模块的一些小细节。具体来说,我需要一个不同的表单,将用户名作为电子邮件字段(电子邮件作为备用电子邮件地址)(我不想修改auth,只需要简单的表单更改即可。) 当我将autodiscover与自定义的ModelAdmin一起用于auth时,我最终与auth自己的管理界面冲突,并得到一个“已注册”错误 看起来我必须创建我自己的管理站点,列举我所有的模型。虽然只有18个类,但这似乎是一个枯燥的问题——每次更改都需要添加到模型和添加到自定义

我想修改Django内置的
Django.contrib.auth
模块的一些小细节。具体来说,我需要一个不同的表单,将用户名作为电子邮件字段(电子邮件作为备用电子邮件地址)(我不想修改
auth
,只需要简单的表单更改即可。)

当我将
autodiscover
与自定义的
ModelAdmin
一起用于
auth
时,我最终与
auth
自己的管理界面冲突,并得到一个“已注册”错误

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


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

以上都没有。只需使用admin.site.unregister()(n.b.is\u在Django core的用户模型中,默认情况下,主动过滤现在在用户模型上;这里仍然作为一个示例使用),一切尽可能干燥:

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)

我认为使用自定义身份验证后端来实现这一点可能更容易,从而消除了对自定义ModelAdmin的需要

我对这个片段做了类似的操作:

Sweet——完全错过了
sites.adminisite
中的unregister方法。这很有趣。感谢分享,Carl。我注意到,在我的代码中添加了unregister()调用之后,我不得不在Django“看到”我所做的更改之前手动终止并重新启动我的开发服务器。这让我浪费了15分钟试图弄清楚为什么取消注册()不起作用。这最终让我想到了堆栈溢出问题,我发现我所做的应该是起作用的。:-)@Brandon是的,一般来说,Django的admin.py自动发现无法很好地与开发服务器自动重新加载配合使用。如果你的admin.py中出现语法错误,这也会影响你;修复后,错误会消失,但在你手动重新启动开发服务器之前,该应用程序将完全从管理中丢失。令人恼火,但我还没有发现因为Django不会让你注册同一个模型两次,而且用户已经由contrib.auth用它的UserAdmin类注册了。所以你必须先注销它,然后才能用你自己的ModelAdmin子类注册它。实际上,我需要增强的后端和前端。我需要usernames是电子邮件地址,因此“@domain”确保它们是唯一的。我已经在使用您的代码片段。但将其作为此答案集的一部分会有所帮助。