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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
Dec 11 Python
python [:3] 实现提取数组中的数
Nov 27 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
Python操作Jira库常用方法解析
Apr 10 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
了解一下python内建模块collections
Sep 07 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
python 日志模块logging的使用场景及示例
Jan 04 Python
Python 批量下载阴阳师网站壁纸
May 19 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 tp验证表单与自动填充函数代码
2012/02/22 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
Python更新所有已安装包的操作
2020/02/13 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
如何设置Java的运行环境
2013/04/05 面试题
Java平台和其他软件平台有什么不同
2015/06/05 面试题
酒吧创业计划书
2014/01/18 职场文书
最新个人职业生涯规划书
2014/01/22 职场文书
2014和解协议书范文
2014/09/15 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
工作收入证明范本
2015/06/12 职场文书
2016中秋节问候语
2015/11/11 职场文书
Python编程super应用场景及示例解析
2021/10/05 Python