如何在Django Admin面板主页展示指定模型的字段
在Django Admin主页直接展示指定模型字段的实现方法
要在Django Admin主页直接展示某个模型的字段,无需点击模型入口,你可以通过自定义Admin站点模板和扩展AdminSite类实现,具体步骤如下:
1. 自定义Admin主页模板
Django Admin默认主页模板是admin/index.html,我们需要重写它来插入自定义内容:
- 在项目根目录的
templates文件夹下创建admin子目录(无则新建) - 新建
index.html文件,继承Admin基础模板并替换content区块,示例代码:
{% extends "admin/base_site.html" %} {% load i18n static %} {% block content %} <!-- 保留原有App列表展示 --> <div id="content-main"> {% if app_list %} {% for app in app_list %} <div class="app-{{ app.app_label }} module"> <table> <caption> <a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a> </caption> {% for model in app.models %} <tr class="model-{{ model.object_name|lower }}"> {% if model.admin_url %} <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th> {% else %} <th scope="row">{{ model.name }}</th> {% endif %} {% if model.add_url %} <td><a href="{{ model.add_url }}" class="addlink">{% translate 'Add' %}</a></td> {% else %} <td></td> {% endif %} {% if model.admin_url and show_changelinks %} {% if model.view_only %} <td><a href="{{ model.admin_url }}" class="viewlink">{% translate 'View' %}</a></td> {% else %} <td><a href="{{ model.admin_url }}" class="changelink">{% translate 'Change' %}</a></td> {% endif %} {% elif show_changelinks %} <td></td> {% endif %} </tr> {% endfor %} </table> </div> {% endfor %} {% else %} <p>{% translate "You don't have permission to view or edit anything." %}</p> {% endif %} <!-- 新增自定义模型展示区块 --> <div class="app-myapp module"> <table> <caption>{% translate '核心数据展示' %}</caption> {% if custom_model_data %} {% for item in custom_model_data %} <tr> <th scope="row">{{ item.title }}</th> <td>{{ item.content }}</td> <td><a href="{% url 'admin:myapp_mymodel_change' item.id %}" class="changelink">{% translate '修改' %}</a></td> </tr> {% endfor %} {% else %} <tr><td>{% translate '暂无数据' %}</td></tr> {% endif %} </table> </div> </div> {% endblock %}
2. 扩展AdminSite类传递模型数据
自定义AdminSite类,把目标模型的数据注入模板上下文:
- 在项目
admin.py中编写自定义站点逻辑:
from django.contrib.admin import AdminSite from .models import MyModel # 替换成你要展示的模型 class MyAdminSite(AdminSite): def index(self, request, extra_context=None): extra_context = extra_context or {} # 按需获取模型数据,示例取最新5条 extra_context['custom_model_data'] = MyModel.objects.all()[:5] # 权限控制:仅给有权限的用户展示 if not request.user.has_perm('myapp.view_mymodel'): extra_context['custom_model_data'] = None return super().index(request, extra_context=extra_context) # 实例化自定义站点 admin_site = MyAdminSite(name='myadmin') # 注册所有模型到自定义站点 from .models import OtherModel, AnotherModel admin_site.register(MyModel) admin_site.register(OtherModel) admin_site.register(AnotherModel)
- 在项目
urls.py中替换默认Admin路由:
from django.contrib import admin from .admin import admin_site urlpatterns = [ # path('admin/', admin.site.urls), # 注释默认路由 path('admin/', admin_site.urls), # 使用自定义站点 ]
3. 样式适配(可选)
示例中用了Django Admin默认的app-xxx module类,展示框体样式会和默认App列表保持一致,无需额外CSS。若需调整样式,可在模板中添加自定义CSS或修改现有类。
内容的提问来源于stack exchange,提问作者ETHERC20
相关产品推荐
相关产品推荐

