覆盖 AdminSite 使 admin.py 另一个应用程序不显示在 django 管理

override AdminSite make admin.py another app doesn't show at django admin

在我的项目中,有多个应用程序,所以我也有 admin.py 每个文件夹。这是我的一些 admin.py

api/admin.py

from django.contrib import admin
from .models import Message

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['source','name','created']
    list_filter = ['source','created']
    search_fields = ['message']

dummy/admin.py

from django.contrib.admin import AdminSite
from dummy.forms import MyAdminLoginForm

# export admin.py another app
from api.models import Message
from api.admin import MessageAdmin

class MyAdminSite(AdminSite):
    login_form = MyAdminLoginForm
    login_template = 'dummy/templates/admin/login.html'

site = MyAdminSite()
site.register(Message,MessageAdmin)

因为我想在 django 管理员登录时使用验证码,我应该通过 dummy/admin.py 覆盖从 AdminSite 继承的登录表单。之后我在主 url

上注册自定义登录
from django.contrib import admin
from django.urls import path, include
from dummy.admin import site
admin.site = site

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls'))
]

你可以看到我在 dummy/admin.py 上重新注册了 api/admin.py,我这样做是因为如果我没有重新注册 api/admin.py,它不会显示在 django 管理员中。当我使用从 AdminSite

继承的自定义登录表单时,我应该怎么做才能使 admin.py 另一个应用程序不需要像以前那样重新注册

您可以只修补并使用原来的 admin.site:

from django.contrib import admin

admin.site.login_form = MyAdminLoginForm
admin.site.login_template = 'dummy/templates/admin/login.html'