Django admin后台添加自定义菜单和功能页面

django admin是根据注册的模型来动态生成菜单,从这个思路出发,如果想添加自定义菜单,那就创建一个空模型并且注册。步骤如下:

1、创建空模型:

python 复制代码
class ResetSVNAuthFileModel(models.Model):
    """仅用来显示一个菜单"""

    class Meta:
        verbose_name = '重置授权文件'
        verbose_name_plural = verbose_name

2、注册到admin.py

重写changelist_view函数,使其点击菜单时,展示自定义的页面。在此你可以做orm查询,并且将数据渲染到模板中。而我想实现的是在页面中点击一个按钮来触发请求后端接口,来实现某种行为。

python 复制代码
from django.contrib import admin
from django.shortcuts import render

from apps.setting.models import ResetSVNAuthFileModel

@admin.register(ResetSVNAuthFileModel)
class FeedbackStatsAdmin(admin.ModelAdmin):
    def changelist_view(self, request, extra_content=None):
        template_name = 'reset_svn_auth_file.html'
        return render(request, template_name)
复制代码
reset_svn_auth_file.html:
html 复制代码
{% extends "admin/base_site.html" %}
{% load static %}

{% block content %}
    <div class="text-center">
        <!-- 点击按钮调用 JavaScript 函数 -->
        <button onclick="resetFunction()" id="resetButton" class="btn btn-primary btn-lg">重置授权文件</button>
    </div>
{% endblock %}

{% block extrahead %}
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
    <script>
        function resetFunction() {
            // 禁用按钮
            document.getElementById("resetButton").disabled = true;
            // 发送 AJAX 请求到 Django 视图
            fetch('/admin-api/reset-auth-file').then(response => {
                if (response.ok) {
                    Swal.fire({
                        icon: 'success',
                        title: 'OK',
                        text: '操作成功',
                    })
                } else {
                    response.json().then(data => {
                        console.log(data)
                        Swal.fire({
                            icon: 'error',
                            title: '重置失败',
                            text: data.msg,
                        })
                    })
                }
            }).catch((error) => {
                Swal.fire({
                    icon: 'error',
                    title: 'Oops...',
                    text: '请求失败',
                })
            }).finally(() => {
                // 恢复按钮状态
                document.getElementById("resetButton").disabled = false;
            });
        }
    </script>
{% endblock %}

把该文件放在空模型所在app下的templates文件夹。

3、定义后端路由和接口

django总路由:

python 复制代码
from django.contrib import admin
from django.urls import path, include

from apps.repository.views import ResetAuthFileView

admin_api = [
    path('reset-auth-file/', ResetAuthFileView.as_view(), name='reset-auth-file'),

]

urlpatterns = [
    path('admin/', admin.site.urls),
    path('admin-api/', include(admin_api)),  # 在admin 自定义页面中发送过来的请求
]

接口函数:

python 复制代码
class ResetAuthFileView(APIView):
    def get(self, request):
        # 可以写个中间件做认证
        sessionid = request.COOKIES.get('sessionid')
        csrftoken = request.COOKIES.get('csrftoken')

        session = SessionStore(session_key=sessionid)
        if not session.exists(session_key=sessionid):
            return Response(status=401)
        try:
            SVN.reset_authz_file()
        except Exception as e:
            return Response(data={'msg': f'重置失败:{e}'}, status=400)
        return Response(data={'msg': '重置完成'})

大功告成,看成果:

点击菜单后的页面:

相关推荐
比兔代理2 小时前
正向代理与反向代理技术辨析,为什么代理 IP 属于正向代理
服务器·网络·http·ip
十二同学啊3 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
Wang's Blog3 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog3 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
蓝速科技4 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
Ivanqhz4 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
骇客野人6 小时前
测试环境MySQL迁移Vastbase(海量数据库)完整改造与落地实施方案
运维·服务器
一 乐6 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
Wang's Blog7 小时前
Java 项目实战: 外卖平台-删除分类的关联校验与自定义业务异常
java·服务器·项目开发
zly35007 小时前
VMware Converter Standalone 物理机转化为虚拟机后源1硬盘变成了2个硬盘(2个硬盘文件)虚拟机无法启动。
linux·运维·服务器