如何在Django Admin面板内添加可点击的自定义路由
在Django Admin侧边栏添加自定义路由的实现方案
下面提供两种实用的实现方式,你可以根据需求选择:
前提准备
先确保你的自定义视图已配置好路由并添加权限验证:
- 在项目/应用的
urls.py中配置路由:
from django.urls import path from .views import my_custom_view urlpatterns = [ # 其他路由... path('my-view/', my_custom_view, name='my-custom-view'), ]
- 给自定义视图添加Admin权限控制(确保只有后台用户能访问):
from django.contrib.admin.views.decorators import staff_member_required from django.shortcuts import render @staff_member_required def my_custom_view(request): # 你的视图逻辑代码 return render(request, 'my_view.html', {})
方法一:直接扩展Admin模板(快速实现)
适合只添加少量自定义链接的场景:
- 在项目根目录的
templates文件夹下创建admin目录,新建base_site.html文件:
{% extends "admin/base_site.html" %} {% block nav-sidebar %} {{ block.super }} <!-- 插入自定义侧边栏模块 --> <div class="module"> <h2>自定义工具</h2> <ul class="actionlist"> <li> <a href="{% url 'my-custom-view' %}" class="icon-link">我的自定义视图</a> </li> </ul> </div> {% endblock %}
注:如果你的Django版本低于4.0,将
nav-sidebar替换为sidebar即可。
- 启动服务后,登录Admin就能在侧边栏看到新增的链接。
方法二:自定义AdminSite(灵活扩展)
适合需要批量管理多个自定义链接、后续有扩展需求的场景:
- 在应用的
admin.py中定义自定义AdminSite:
from django.contrib.admin import AdminSite from django.urls import reverse class CustomAdminSite(AdminSite): def each_context(self, request): context = super().each_context(request) # 批量添加自定义链接 context['custom_links'] = [ { 'name': '我的自定义视图', 'url': reverse('my-custom-view'), 'icon': 'icon-link' }, # 可以继续添加更多链接 ] return context # 实例化自定义AdminSite admin_site = CustomAdminSite(name='custom_admin') # 将你的模型注册到自定义AdminSite(替代原有的admin.site.register) from .models import YourModel1, YourModel2 admin_site.register(YourModel1) admin_site.register(YourModel2)
- 修改项目根目录的
urls.py,替换默认的Admin路由:
from django.urls import path from your_app.admin import admin_site urlpatterns = [ # 注释掉原有的默认Admin路由 # path('admin/', admin.site.urls), path('admin/', admin_site.urls), # 其他路由... ]
- 新建
templates/admin/sidebar.html文件,渲染自定义链接:
{% extends "admin/sidebar.html" %} {% block nav-sidebar %} {{ block.super }} {% if custom_links %} <div class="module"> <h2>自定义工具</h2> <ul class="actionlist"> {% for link in custom_links %} <li> <a href="{{ link.url }}" class="{{ link.icon }}">{{ link.name }}</a> </li> {% endfor %} </ul> </div> {% endif %} {% endblock %}
内容的提问来源于stack exchange,提问作者nerd_geek365
相关产品推荐
相关产品推荐

