Python Django给admin添加Action的方法实例详解
作者:第八个部落 发布时间:2023-10-30 13:11:35
在使用Django自带的admin后台的时候,他提供了一些默认的指令可以对数据进行操作, 比如批量删除,修改等
同样的我们也可以添加自己的指令。
创建一个Django项目
$ django-admin startproject DjangoActions
$ cd DjangoActions
$ python3 manage.py startapp mysite添加model
打开mysite下的models.py
from django.db import models
class Article(models.Model):
# 文章状态,类似枚举
STATUS_CHOICES = (
('d', '草稿'),
('p', '发布'),
)
# 标题
title = models.CharField(max_length=30)
# 内容
body = models.TextField()
# 状态
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='d')
def __str__(self):
return self.title将Article注册到admin
打开mysite下的admin.py
from django.contrib import admin
from .models import Article
# 指令处理函数,参数固定写法
def make_article_published(modeladmin, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合
actions = [make_article_published]启动服务
1.首先同步数据库
$ python3 manage.py makemigrations
$ python3 manage.py migrate
2.创建超级用户
$ python3 manage.py createsuperuser按照提示操作即可
3.启动服务
$ python3 manage.py runserver
效果
1.点击MYSITE下面Articles右边的add,添加一个文章。保存文章后会自动跳到文章列表。
2.点击Action右边的option。
我们自己的action已经添加进来了。
可以尝试选择文章前面的checkbox然后将其标记为发布。
将action定义到ModelAdmin内部
上面已经添加好了,一个自定义action但是看起有点不是很直观,不符合封装原理。 我们稍作修改。
from django.contrib import admin
from .models import Article
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合 修改为字符串
actions = ['make_article_published']
# 指令处理函数,参数固定写法
def make_article_published(self, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 操作完成后的提示信息
self.message_user(request, '修改成功')
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
重起服务器,再次修改状态,依旧执行成功,而且还有提示信息
跳转到中间页面
Django默认执行完动作后会返回到当前页面并刷新,同样我们也可以自定义跳转到其他页面。 只需在动作函数上返回一个HttpResponse即可。
views.py
from django.shortcuts import render
def success(request):
return render(request, 'success.html')
DjangoActions/urls.py
from mysite.views import success
urlpatterns = [
path('admin/', admin.site.urls),
path('success/', success, name='success'),
]
templates/success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
success
</body>
</html>
mysite/admin.py
from django.contrib import admin
from .models import Article
from django.shortcuts import redirect
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合 修改为字符串
actions = ['make_article_published']
# 指令处理函数,参数固定写法
def make_article_published(self, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 此处使用的转发,一可以直接使用HttpResponse
return redirect('success')
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
再次尝试修改,成功后会跳转到
整个站点的action
有时候为了方便,可能这个站点都有一个相同的动作,那么每一个modelAdmin都写一遍似乎有点傻,我们 可以配置整个站点的action解决问题。
使用方式:
from django.contrib import admin
admin.site.add_action(make_article_published)
禁用action
禁用全站级别的acitons:
# 禁用默认的删除
admin.site.disable_action('delete_selected')
全站禁用,个别可用 启用了全站禁用,某个又想使用怎么办,只需单独添加到actions里面就可以了
# 禁用默认的删除
admin.site.disable_action('delete_selected')
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合
actions = ['delete_selected']
在指定模型中禁用所有actions 如果将模型中的actions=None
那么所有的action都不可用,包括系统默认的
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合
actions = None
根据条件自动启用或禁用
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合 修改为字符串
actions = ['make_article_published']
# 指令处理函数,参数固定写法
def make_article_published(self, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 此处使用的转发,一可以直接使用HttpResponse
return redirect('success')
# 重写此方法,做出判断即可
def get_actions(self, request):
actions = super(ArticleAdmin, self).get_actions(request)
if request.user.username[0].upper() != 'SuperUser':
if 'delete_selected' in actions:
del actions['delete_selected']
return actions
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
总结
以上所述是小编给大家介绍的Django给admin添加Action的方法实例详解网站的支持!
来源:https://litets.com/article/2019/4/29/386.html


猜你喜欢
- 本文实例讲述了php面象对象数据库操作类。分享给大家供大家参考。具体实现代码如下://此处构造一个数据库操作类,封装所有数据库操作 //可以
- 本文实例分析了CI框架出现mysql数据库连接资源无法释放的解决方法。分享给大家供大家参考,具体如下:使用ci框架提供的类查询数据:$thi
- 一、外键设置方法1、在MySQL中,为了把2个表关联起来,会用到2个重要的功能:外键(FOREIGN KEY)和连接(JOIN)。外键需要在
- 1.echo和print的区别PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的。echo输出后没有返回值,但
- 本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。数据表结构这里我用一个比较简单的例子来说明,也是行转列的经典
- 前言:今天我教大家如何利用Python自动化操作Excel,包括:介绍操作Excel的工具包、安装方法及操作Excel具体方法。对于每天有大
- folder.htm<html><head><title>闪亮日子之在线创建文件夹</title&
- 常见的协议http和httpshttp协议:超文本传输协议,是一个发布和接受HTML页面的方法,端口是80https 协议:http协议的加
- 前言其实Python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时
- 问题描述:一个父容器也是window的window下的comboBox在页面中点击无效,但是在控制台中查看它的store却是有值的,问题在于
- 今天遇到一个需求,就是将一个list文件读取后,存入一个txt配置文件。存入时,发现list文件无法直接存入,必须转为str模式。但在读取t
- 用requests包请求https的网站时,我们偶尔会遇到证书问题。也就是常见的SSLerror,遇到这种问题莫慌莫慌。这里没有找到合适的网
- 本文实例为大家分享了vue实现选择商品规格功能的具体代码,供大家参考,具体内容如下要实现上图的效果,代码如下:<template>
- 目录过程拍照用到的Python 操作库Python遍历文件夹获取图片旋转图片展示方向并压缩像素整体代码整体代码将脚本打包成exe安装&nbs
- 说到这个问题,基本上有人就会想到三个问题:1,什么是系统数据?2,为什么要移动系统数据库?3,移动系统数据库我们可以用附加和分离,为什么还要
- 前言本文主要给大家介绍了关于mysql语句插入含单引号或反斜杠值的相关内容,下面话不多说了,来一起看看详细的介绍吧比如说有个表,它的结构是这
- 在我们编程过程中,经常会用到与时间相关的各种务需求,下面来介绍 golang 中有关时间的一些基本用法,我们从 time 的几种 type
- ipython notebook经常被我用作debug的工具。今天调试一段代码,里面用到了argparse这个包来解析命令行参数。但是在ip
- 之前写了一篇flask开发环境搭建,今天继续,进行一个实战小项目-blog系统。blog系统很简单,只有一个页面,然后麻雀虽小五脏俱全。这里
- pcntl扩展可以支持php的多线程操作(仅限linux)原本需要重新编译PHP的后面configrue提示加上--enable-pcntl