如何在Django Admin中添加自定义菜单

2023-04-11 00:00:00 自定义 添加 菜单

在Django Admin中添加自定义菜单,需要进行如下步骤:

  1. 创建一个新的app,命名为“myadmin”。

  2. 在app的目录下创建一个名为“admin.py”的文件,在文件中添加如下代码:

from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html

class MyAdminSite(admin.AdminSite):
    site_header = 'My Admin Site'
    site_title = 'My Admin Site'

myadmin_site = MyAdminSite(name='myadmin')

class MyMenuItem:
    def __init__(self, label, url_name, icon=None, order=None):
        self.label = label
        self.url_name = url_name
        self.icon = icon
        self.order = order

    def render(self, request):
        url = reverse(self.url_name, current_app=myadmin_site.name)
        if self.icon:
            html = '<i class="{}"></i> {}'.format(self.icon, self.label)
        else:
            html = self.label
        return format_html('<li><a href="{}">{}</a></li>', url, html)

myadmin_site.index_template = 'admin/myadmin_index.html'
myadmin_site.register(MyMenuItem)
  1. 在app的目录下创建一个名为“templates/admin/myadmin_index.html”的模板文件,在文件中添加如下代码:
{% extends "admin/index.html" %}

{% block nav-global %}
    {{ block.super }}
    <h3>My Custom Menu</h3>
    <ul class="nav">
        {% for item in site.get_urls %}
            {% if item.name == 'myadmin:myadmin_index' %}
                {% continue %}
            {% endif %}
            {% if item.name == 'logout' %}
                {% with item.url as logout_url %}
                    {% if perms.admin %}
                        {{ item.render }}
                    {% endif %}
                {% endwith %}
            {% else %}
                {{ item.render }}
            {% endif %}
        {% endfor %}
    </ul>
{% endblock %}
  1. 在项目的urls.py中添加如下路由,以注册MyAdminSite:
from myadmin.admin import myadmin_site

urlpatterns = [
    path('myadmin/', myadmin_site.urls),
    # ...
]
  1. 在需要添加自定义菜单的app的目录下创建一个名为“admin_menu.py”的文件,在文件中添加如下代码:
from myadmin.admin import MyMenuItem, myadmin_site

class MyCustomMenuItem(MyMenuItem):
    def __init__(self):
        super().__init__(
            label='My Custom Menu Item', 
            url_name='myadmin:my_custom_view', 
            icon='fa fa-list',
            order=10
        )

myadmin_site.register(MyCustomMenuItem())
  1. 在需要添加自定义菜单的app的目录下创建一个名为“views.py”的文件,在文件中添加如下代码:
from django.shortcuts import render

def my_custom_view(request):
    return render(request, 'admin/my_custom_view.html', {})
  1. 在需要添加自定义菜单的app的目录下创建一个名为“templates/admin/my_custom_view.html”的模板文件,在文件中添加如下代码:
{% extends "admin/base_site.html" %}

{% block content_title %}
    <h1>My Custom View</h1>
{% endblock %}

{% block content %}
    <p>Welcome to My Custom View!</p>
{% endblock %}

这样,在Django Admin中就会显示一个名为“My Custom Menu Item”的菜单,点击后会跳转到“My Custom View”的页面。

相关文章