Python Django给admin添加Action的方法实例详解


Posted in Python onApril 29, 2019

在使用Django自带的admin后台的时候,他提供了一些默认的指令可以对数据进行操作, 比如批量删除,修改等

Python Django给admin添加Action的方法实例详解

  同样的我们也可以添加自己的指令。

创建一个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。

Python Django给admin添加Action的方法实例详解

我们自己的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 = '更改状态为发布'

重起服务器,再次修改状态,依旧执行成功,而且还有提示信息

Python Django给admin添加Action的方法实例详解

跳转到中间页面

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 = '更改状态为发布'

再次尝试修改,成功后会跳转到

Python Django给admin添加Action的方法实例详解

整个站点的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的方法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python备份文件的脚本
Aug 11 Python
Python基于DES算法加密解密实例
Jun 03 Python
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
关于python3中setup.py小概念解析
Aug 22 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
Cython编译python为so 代码加密示例
Dec 23 Python
Python hashlib常见摘要算法详解
Jan 13 Python
Python列表如何更新值
May 27 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 #Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 #Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 #Python
详解【python】str与json类型转换
Apr 29 #Python
python实现给微信指定好友定时发送消息
Apr 29 #Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 #Python
Django Sitemap 站点地图的实现方法
Apr 29 #Python
You might like
php下使用SMTP发邮件的代码
2008/01/10 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
发现的以前不知道的函数
2006/09/19 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
js实现下一页页码效果
2017/03/07 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
js装饰设计模式学习心得
2018/02/17 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
Python help()函数用法详解
2014/03/11 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
Python随机数random模块使用指南
2016/09/09 Python
Django中的文件的上传的几种方式
2018/07/23 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
详解django中使用定时任务的方法
2018/09/27 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
开办加工厂创业计划书
2014/01/03 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
求职信内容怎么写
2014/05/26 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL
Python制作春联的示例代码
2022/01/22 Python
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS