如何在Django非Admin面板视图中传递available_apps及获取应用列表
解决Django非Admin视图获取Admin风格应用列表的问题
为什么你的代码返回空列表?
你直接实例化AdminSite()得到的是一个全新的、未注册任何模型的站点实例,自然拿不到应用列表。Django默认的Admin站点是django.contrib.admin.site,所有你注册到Admin的模型都绑定在这个实例上。
正确实现方式
用默认Admin站点实例
直接调用默认站点的get_app_list方法即可:
from django.contrib.admin import site def change_view(self, request): # ... 你的其他视图逻辑 context = { # ... 其他上下文变量 'available_apps': site.get_app_list(request) } return render(request, 'parts/part_form.html', context=context)
如果用了自定义AdminSite
要是你项目里自己定义了AdminSite(比如在某个admin.py里写了class MyAdminSite(AdminSite)并实例化),就用你自己的站点实例:
# 假设自定义站点在myapp/admin.py里 from myapp.admin import my_admin_site def change_view(self, request): # ... 你的其他视图逻辑 context = { # ... 其他上下文变量 'available_apps': my_admin_site.get_app_list(request) } return render(request, 'parts/part_form.html', context=context)
额外说明
get_app_list会自动根据当前登录用户的权限过滤内容,返回的就是用户在Admin面板里能看到的应用和模型列表,权限逻辑和Admin完全一致。- 要是你需要定制应用列表的排序、显示内容,可以直接参考Django源码里
AdminSite.get_app_list的实现,自己写过滤和整理逻辑。
内容的提问来源于stack exchange,提问作者SpaceShaman
相关产品推荐
相关产品推荐

