如何在Django中将Product模型指定实例注册为Admin侧边栏可访问视图
实现步骤
步骤1:提前创建目标产品实例
先在数据库中创建你需要直接显示的Product实例(比如名称为Shoes的产品),可以直接通过名称查询该实例,不需要固定记录主键ID。
步骤2:自定义Admin站点重写菜单逻辑
在你的APP的admin.py文件中添加如下代码,自定义Django Admin站点,在侧边栏注入自定义的ADMININFO分类和单个产品入口:
from django.contrib.admin import AdminSite from django.urls import reverse from .models import Product, Supplier # 自定义Admin站点 class CustomAdminSite(AdminSite): site_header = "管理后台" site_title = "管理后台" def get_app_list(self, request): # 先获取默认生成的应用菜单列表 app_list = super().get_app_list(request) # 查询要添加的目标产品实例 try: target_product = Product.objects.get(name="Shoes") # 构造该产品实例的详情/编辑页URL,注意把下方的myapp替换为你的Product模型所在APP的名称 product_url = reverse("admin:myapp_product_change", args=(target_product.pk,)) # 查找已有的ADMININFO分类,不存在则创建 admininfo_menu = next((item for item in app_list if item["name"] == "ADMININFO"), None) if not admininfo_menu: admininfo_menu = { "name": "ADMININFO", "app_label": "admininfo", "models": [] } app_list.append(admininfo_menu) # 把单个产品入口添加到ADMININFO分类下 admininfo_menu["models"].append({ "name": "Shoes产品详情", # 侧边栏显示的文字 "object_name": "ShoesProduct", "admin_url": product_url, "perms": {"view": True} # 可根据需求调整权限控制 }) except Product.DoesNotExist: # 目标产品未创建时不显示入口,避免报错 pass return app_list # 实例化自定义Admin站点 admin_site = CustomAdminSite(name="custom_admin") # 把你原来注册到默认admin的模型注册到自定义站点 class ProductAdmin(admin.ModelAdmin): # 如果你希望该入口点击后只能查看不能编辑,可以添加以下权限控制 def has_change_permission(self, request, obj=None): if obj and obj.name == "Shoes": return False return super().has_change_permission(request, obj) admin_site.register(Product, ProductAdmin) admin_site.register(Supplier)
步骤3:替换默认Admin路由
修改项目根目录的urls.py,把默认的Admin路由替换为你自定义的Admin站点路由:
from django.contrib import admin from django.urls import path # 导入你自定义的admin站点,注意把myapp替换为对应的APP名称 from myapp.admin import admin_site urlpatterns = [ # 注释掉原来的默认admin路由 # path('admin/', admin.site.urls), path('admin/', admin_site.urls), # 其他路由保持不变 ]
注意事项
- 构造URL时的
admin:myapp_product_change规则为admin:<APP名称>_<模型名小写>_change,如果不确定可以执行python manage.py show_urls查看对应路由名 - 如果你需要添加多个单个产品入口,只需要重复查询实例、构造URL、添加到
admininfo_menu['models']的逻辑即可 - 权限控制可以按需调整,比如仅超级用户可见的话,只需要在添加入口前加
if request.user.is_superuser:判断即可
内容的提问来源于stack exchange,提问作者Tsige Gebregziagher
相关产品推荐
相关产品推荐

