You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django原生Admin替换首页模板后的数据传递与自定义视图实现问题

Django原生Admin替换首页模板后的数据传递与自定义视图实现问题

嘿,完全理解你想保留Django原生Admin全部功能,只替换首页模板、展示自定义模型数据,甚至给首页加专属逻辑的需求——这绝对可以实现,下面给你两种最实用的方案,你可以根据自己的需求选:

方案一:重写AdminSite类,传递自定义数据到替换的模板

如果只是想给默认的Admin首页模板加自己的模型数据,同时其他Admin页面完全保持原生,最稳妥的方式是继承系统的AdminSite类,重写它的index方法来注入上下文数据:

  1. 创建自定义AdminSite子类
    在你的项目(或某个app)的admin.py里写这样的代码:
from django.contrib.admin import AdminSite
from myapp.models import YourModel  # 替换成你要展示的模型

class CustomAdminSite(AdminSite):
    def index(self, request, extra_context=None):
        # 初始化上下文字典,如果没有传入就创建空字典
        extra_context = extra_context or {}
        # 把你需要的模型数据塞进去,比如获取该模型的所有对象
        extra_context['custom_model_data'] = YourModel.objects.all()
        # 调用父类的index方法,把自定义上下文传进去,保证原生逻辑不受影响
        return super().index(request, extra_context=extra_context)

# 实例化自定义的Admin站点
custom_admin_site = CustomAdminSite(name='custom_admin')

# 把你要在Admin里管理的模型注册到这个自定义站点
custom_admin_site.register(YourModel)
# 如果有其他模型,继续注册,比如 custom_admin_site.register(AnotherModel)
  1. 修改urls.py指向自定义站点
    原来的path('admin/', admin.site.urls)要改成指向我们的自定义站点:
from django.urls import path
from .admin import custom_admin_site  # 导入刚才创建的自定义站点

urlpatterns = [
    path('admin/', custom_admin_site.urls),
    # 其他URL路径保持不变
]
  1. 在自定义模板里使用数据
    现在你之前设置的admin/list-aprovals.html模板里,就可以直接用{{ custom_model_data }}来调用你传递的模型数据了。建议模板继承原生Admin的base.html,这样能自动复用Admin的样式和布局,比如:
{% extends "admin/base.html" %}

{% block content %}
    <h1>我的自定义Admin首页</h1>
    <div class="custom-data">
        <h3>待审批列表:</h3>
        <ul>
            {% for item in custom_model_data %}
                <li>{{ item.title }} - {{ item.created_at }}</li>
            {% endfor %}
        </ul>
    </div>
    <!-- 也可以保留原生Admin的应用列表,直接用原生的app_list变量 -->
    {% include "admin/app_list.html" with app_list=app_list %}
{% endblock %}

方案二:给/admin/URL绑定自定义视图,完全自定义首页逻辑

如果你想让Admin首页彻底变成自己的视图(比如加复杂的业务逻辑),同时让admin/下的其他路径(比如admin/myapp/mymodel/)还是原生Admin,那可以用URL优先级匹配的方式:

  1. 编写自定义Admin首页视图
    在你的views.py里写一个视图,记得加上Admin的登录验证(只有后台员工能访问):
from django.contrib.admin.views.decorators import staff_member_required
from django.shortcuts import render
from myapp.models import YourModel

@staff_member_required  # 确保只有登录的后台用户能访问
def custom_admin_home(request):
    # 处理你的自定义逻辑,比如过滤特定状态的模型数据
    pending_approvals = YourModel.objects.filter(status='pending')
    # 渲染自定义模板,同时可以传入原生Admin需要的上下文(比如app_list保留应用列表)
    return render(request, 'admin/list-aprovals.html', {
        'pending_approvals': pending_approvals,
        'title': '审批管理首页',
        'app_list': custom_admin_site.get_app_list(request)  # 这个custom_admin_site是方案一里的,或者用admin.site.get_app_list(request)
    })
  1. 调整urls.py的匹配顺序
    把自定义视图放在原生Admin URL的前面,这样访问admin/时会优先匹配自定义视图,而子路径会匹配原生Admin:
from django.urls import path, include
from django.contrib import admin
from .views import custom_admin_home
from .admin import custom_admin_site  # 如果用了方案一的自定义站点,否则用admin.site

urlpatterns = [
    path('admin/', include([
        path('', custom_admin_home),  # 匹配根路径 /admin/
        path('', custom_admin_site.urls),  # 匹配 /admin/ 下的其他子路径
        # 如果没用自定义站点,就换成 path('', admin.site.urls)
    ])),
]

这样设置后,用户访问admin/看到的是你的自定义首页,点应用列表里的模型链接,还是会跳转到原生的Admin增删改查页面,完美满足你“用原生Admin但改首页”的需求。

小提示

如果你只是单纯替换首页模板不需要传数据,那你原来的admin.site.index_template = "admin/list-aprovals.html"是有效的,但只要涉及数据传递,就必须通过重写AdminSite或者自定义视图的方式来实现——原生Admin的index方法不会自动帮你注入额外数据哦。

备注:内容来源于stack exchange,提问作者urdurak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:09:32