django admin 添加自定义页面

在Django中,你可以通过多种方式向Django Admin添加自定义页面。以下是一些常见的方法:

方法1:使用ModelAdmin的get_urls()方法

如果你只是想添加一个简单的页面来展示信息,你可以在你的ModelAdmin类中重写get_urls()方法。

css 复制代码
from django.urls import path
from django.utils.safestring import mark_safe
from django.contrib import admin
from .models import MyModel
 
class MyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            path('my-custom-view/', self.admin_site.admin_view(self.my_custom_view))
        ]
        return my_urls + urls
 
    def my_custom_view(self, request):
        return mark_safe('<h1>这是一个自定义页面</h1>')
 
admin.site.register(MyModel, MyModelAdmin)

方法2:使用SimpleListFilter添加自定义链接

如果你想要在列表页旁边添加一些自定义链接,可以使用SimpleListFilter。

css 复制代码
from django.contrib import admin
from django.utils.safestring import mark_safe
from .models import MyModel
 
class CustomLinkListFilter(admin.SimpleListFilter):
    title = 'custom links'
    template = 'admin/filter.html'
 
    def has_output(self):
        return True
 
    def choices(self, changelist):
        yield {
            'selected': changelist.get_query_string({}),
            'query_string': changelist.get_query_string({}),
            'display': '自定义链接'
        }
 
    def queryset(self, request, queryset):
        return queryset
    
    def output(self, changelist):
        return mark_safe('<a href="/admin/myapp/mymodel/my-custom-view/">自定义页面</a>')
 
class MyModelAdmin(admin.ModelAdmin):
    list_filter = (CustomLinkListFilter,)
 
admin.site.register(MyModel, MyModelAdmin)

方法3:使用admin_site.index和admin_site.app_index装饰器添加页面到主索引页或应用索引页

你可以通过重写index和app_index视图来添加自定义页面。例如,如果你想在应用的主页旁边添加一个链接:

css 复制代码
from django.contrib import admin
from django.urls import path, reverse, NoReverseMatch
from django.utils.safestring import mark_safe
from .models import MyModel
 
class MyModelAdmin(admin.ModelAdmin):
    pass  # 实现你的自定义逻辑,例如列表展示或表单等。
 
admin.site.register(MyModel, MyModelAdmin)
 
@admin.register(MyModel)  # 使用装饰器注册模型和它的管理员类(如果你的Django版本支持)
class MyModelAdmin(admin.ModelAdmin):
    pass  # 实现你的自定义逻辑,例如列表展示或表单等。

然后,你可以通过修改urls.py来添加自定义视图:

css 复制代码
from django.urls import path, include, re_path
from django.contrib import admin
from .views import custom_view  # 确保导入你的视图函数或类视图。
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('admin/myapp/mymodel/my-custom-view/', custom_view, name='custom-view'),  # 添加自定义URL路径和视图。
] + admin.site.urls  # 注意这里的顺序很重要,确保先包含你的自定义路径再包含admin的默认路径。

在views.py中定义你的视图:

css 复制代码
from django.shortcuts import render
from django.http import HttpResponse
from django.utils.safestring import mark_safe
from django.contrib.admin.views.decorators import staff_member_required  # 如果需要限制访问权限。
from django.contrib.auth.decorators import login_required  # 如果需要登录才能访问。
from django.views.decorators.cache import never_cache  # 防止缓存。
from django.views.decorators.csrf import csrf_protect  # 保护CSRF。 如果你使用的是类视图,可以在类中添加。 例如: @method_decorator([login_required, staff
相关推荐
VidDown1 小时前
上传 2GB 文件别让 Django 接:分片上传、对象存储直传与秒传
python·django·音视频·状态模式·实时音视频·视频编解码·视频
菜鸟变凤凰20234 小时前
基于深度学习 YOLOv8 的各种识别系统(Vue3 + Element Plus + Django 全栈项目)
深度学习·yolo·django
专业程序开发源5 小时前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
vx_Biye_Design5 小时前
springboot旅游管理系统18006-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·django·课程设计
汉吉龙测控技术1 天前
多模态数据融合驱动的智能监测实验台
django
wangchunyu1141 天前
食韵味简 —— 免费开源的中式菜谱 API 服务
python·django·开源
专业程序开发源1 天前
SSM笔记本在线销售系统32649-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
gudufy2 天前
ASP.NET Core 多租户如何动态创建数据库?数据库初始化怎么做?
数据库·blazor·admin
我的xiaodoujiao2 天前
Django 基础知识详细图文教程 14-Django 表单定义与使用
开发语言·后端·python·django
我的xiaodoujiao2 天前
Django 基础知识详细图文教程 13-Django 模型定义与使用 3
数据库·后端·python·测试工具·oracle·django