Django Admin如何将多应用模型合并到单个‘Shop’分区?
如何将多Django应用的模型整合到Admin的同一分区
你遇到的问题是因为Django Admin默认按应用的app_label(默认等于应用名称)分组,即便多个应用设置了相同的verbose_name,不同app_label的应用仍会被拆分为独立分组。以下两种方法可以实现将所有模型整合到"Shop"分区的需求:
方法一:给ModelAdmin指定自定义app_label
这是最简单的实现方式,不需要修改Admin站点的核心逻辑,只需在每个应用的admin.py中注册模型时,为对应的ModelAdmin类设置app_label为"Shop"即可:
# orders/admin.py from django.contrib import admin from .models import Order class OrderAdmin(admin.ModelAdmin): app_label = 'Shop' # 指定统一的分组名称 admin.site.register(Order, OrderAdmin)
对baskets、products、offers应用的模型重复上述操作,所有模型就会统一显示在Admin后台的"Shop"分区下。
方法二:自定义AdminSite合并分组
如果需要更灵活的分组逻辑(比如后续要调整分组规则),可以自定义AdminSite并重写get_app_list方法,手动将多个应用的模型合并到同一分组:
- 在项目根目录创建
admin.py,定义自定义AdminSite:
from django.contrib.admin import AdminSite from django.contrib import admin class ShopAdminSite(AdminSite): site_header = 'Shop 管理后台' def get_app_list(self, request): # 获取默认的应用列表 app_list = super().get_app_list(request) shop_models = [] # 收集目标应用的所有模型 target_apps = ['orders', 'baskets', 'products', 'offers'] # 遍历并移除原有应用条目,收集模型 for app in list(app_list): if app['app_label'] in target_apps: shop_models.extend(app['models']) app_list.remove(app) # 添加新的Shop分组 app_list.append({ 'name': 'Shop', 'app_label': 'Shop', 'models': shop_models, }) return app_list # 实例化自定义站点 shop_admin_site = ShopAdminSite(name='shop_admin')
- 在自定义站点中注册所有模型:
# 继续在上述admin.py中添加 from orders.models import Order from baskets.models import Basket from products.models import Product from offers.models import Offer shop_admin_site.register(Order) shop_admin_site.register(Basket) shop_admin_site.register(Product) shop_admin_site.register(Offer)
- 修改项目的
urls.py,替换默认的admin路由:
from django.urls import path from .admin import shop_admin_site urlpatterns = [ path('admin/', shop_admin_site.urls), ]
这样访问Admin后台时,所有目标模型就会统一展示在"Shop"分区下。
内容的提问来源于stack exchange,提问作者Kevin Renskers
相关产品推荐
相关产品推荐

