`

自定义django的admin后台action

 
阅读更多

django的admin后台管理系统中自带了一个批量删除所选对象的action。 django admin action

我们还可以添加自定义的action来实现其它类似的功能,如批量修改某个字段的功能。简单的,例如将文章批量标记为已发布的action,如下:

 1 from django.contrib import admin  
 2 from myapp.models import Article  
 3   
 4 def make_published(modeladmin, request, queryset):  
 5     queryset.update(status='p')   
 6 make_published.short_description = "Mark selected stories as published"  #这里的短描述是action下拉框中显示的描述  
 7   
 8 class ArticleAdmin(admin.ModelAdmin):  
 9     list_display = ['title', 'status']  
10     ordering = ['title']  
11     actions = [make_published]  
12   
13 admin.site.register(Article, ArticleAdmin)  

上面例子中的action比较简单,执行action时也不需要用户输入,实际上更常见的action是需要用户的输入或选择的。例如一个model A中有个外键foreign key关联另一个model B,我希望能有一个action可以批量更改A关联的B对象。对于这种情况,django官方文档中推荐的做法是重定向至另一个View中,并将所需的item id等作为GET query参数传递过去,在另一个View中处理复杂的逻辑,如让用户输入等。 注意到默认的删除action也是需要用户输入的(确认或取消操作),也有另外的页面,但是这个页面的url确实和原先的共用的,也就是说没有完全像文档中推荐的那样有另外一个View。是怎么做到的呢? 直接上代码吧。

 1 from django.contrib import admin, messages  
 2 from django import forms  
 3 from myApp.models import DataSrc  
 4 
 5 class CaseAdmin(admin.ModelAdmin):  
 6   form = CaseForm  
 7   actions = ['update_data_src']  
 8   
 9   class data_src_form(forms.forms.Form):  
10     _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)  
11     data_src = forms.ModelChoiceField(DataSrc.objects)  
12   
13 
14   
15 def update_data_src(modeladmin, request, queryset):  
16   form = None  
17   if 'cancel' in request.POST:  
18     modeladmin.message_user(request, u'已取消')  
19     return  
20   elif 'data_src' in request.POST:  
21     form = modeladmin.data_src_form(request.POST)  
22     if form.is_valid():  
23       data_src = form.cleaned_data['data_src']  
24       for case in queryset:  
25         case.data_src = data_src  
26         case.save()  
27       modeladmin.message_user(request, "%s successfully updated." % queryset.count())  
28       return HttpResponseRedirect(request.get_full_path())  
29     else:  
30       messages.warning(request, u"请选择数据源")  
31       form = None  
32   
33   if not form:  
34     form  = modeladmin.data_src_form(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})  
35   return render_to_response('batch_update.html',  
36                                   {'objs': queryset, 'form': form, 'path':request.get_full_path(), 'action': 'update_data_src', 'title': u'批量修改数据源为'},  
37                                   context_instance=RequestContext(request)  
38         )  
39   
40 update_data_src.short_description = u'批量修改 数据源'

batch_update.html如下:

 1 {% extends "admin/base_site.html" %}  
 2 
 3 {% block content %}  
 4     <form method="post" action="{{ path }}">  
 5         {% csrf_token %}  
 6         {{ form }}  
 7         <p>  
 8             <input type="hidden" name="action" value="{{ action }}" />  
 9             <input type="submit" name="cancel" value="取消" />  
10             <input type="submit" value="确定"/>  
11         </p>  
12     </form>  
13     <p>将批量修改以下所有对象</p>  
14     <ul>  
15         {% for obj in objs %}  
16             <li>{{ obj }}</li>  
17         {% endfor %}  
18     </ul>  
19 {% endblock %} 

简而言之,就是在action中,首先返回一个用户输入(选择)的页面,此页面包含一个form,此form将submit至原先的url,form中包含_selected_action为用户已选择的id,以及action为用户选择的action名(即模拟原先的页面中form表单中的必须元素)。这时候用户再submit时,可识别出用户已经选择了,此时再执行想要的批量操作即可。

reference:

http://www.hoboes.com/Mimsy/hacks/django-actions-their-own-intermediate-page/django

django官方文档

分享到:
评论

相关推荐

    Django Admin后台模型列表页面如何添加自定义操作按钮

    在本案例中,我们将讨论如何在Django Admin后台模型列表页面添加自定义操作按钮,实现“使所有英雄死亡”和“使所有英雄永生”的功能。 首先,我们需要创建一个自定义的管理模型(`ModelAdmin`)类。在这个例子中,...

    django admin后台添加导出excel功能示例代码

    本篇文章将详细介绍如何在Django Admin后台添加导出Excel功能,并提供示例代码。 #### 安装所需依赖 要实现导出Excel功能,我们需要使用`xlwt`库来生成Excel文件。首先确保已经安装了`xlwt`库,如果没有安装可以...

    Django给admin添加Action的步骤详解

    通过以上步骤,我们不仅了解了如何在Django Admin中添加自定义Action,而且还学会了如何自定义Action的实现逻辑。这对于需要频繁进行批量操作的场景来说非常有用。此外,还可以根据具体需求进一步扩展Action的功能,...

    详解Django admin高级用法

    Django admin还支持自定义action,例如批量操作。你可以创建一个方法,然后将其添加到`actions`列表中: ```python class CustomAdmin(admin.ModelAdmin): actions = ['publish_selected'] def publish_selected...

    django xadmin action兼容自定义model权限教程

    ### Django Xadmin Action 兼容自定义Model权限教程 #### 背景介绍 Django Xadmin 是基于 Django 的一个非常强大的管理插件框架,它提供了丰富的功能来增强 Django admin 的用户体验与管理效率。在实际项目开发过程...

    Django关于admin的使用技巧和知识点

    Django admin还支持自定义视图,这意味着你可以创建自己的管理界面,而不仅仅是局限于模型的CRUD操作。例如,你可以创建一个视图来生成报表或执行批量操作: ```python from django.contrib import admin from ...

    Python库 | admin-extra-urls-1.3.1.tar.gz

    "Python库 | admin-extra-urls-1.3.1.tar.gz" 是一个针对Python开发的后端库,其主要功能是扩展Django管理界面(admin site)的功能,提供额外的URL映射,使得开发者能够更加灵活地定制和增强Django管理后台的交互...

    django中上传图片分页三级联动效果的实现代码

    - 在模型类注册到`admin.py`的`admin.site.register()`中,以便在Django后台管理界面中能够看到并操作该模型,如`admin.site.register(models.PicTest)`。 4. **用户自定义页面上传**: - 创建一个HTML表单,使用...

    Django之富文本(获取内容,设置内容方式)

    总结来说,Django中集成TinyMCE富文本编辑器能提供用户友好的文本编辑体验,同时在后台管理和普通页面中都能灵活应用。通过JavaScript交互,开发者还可以实现更多的功能,如动态加载、保存富文本内容等。

    python入门到高级全栈工程师培训 第3期 附课件代码

    07 django模板之自定义filter和simple_tag 08 django模板之继承标签extend和添加标签include 第51章 01 数据库表与表之间的一对多多对多的关系 02 Django的ORM的概念 03 ORM对单表的增删改操作 04 ORM查询API 05 ...

    Django+JS 实现点击头像即可更改头像的方法示例

    为了让这个自定义的用户模型在Django的管理后台可见,还需要在`admin.py`中注册它: ```python from django.contrib import admin from .models import UserModels admin.site.register(UserModels) ``` 同时,在...

    Python-基于开源运维平台Spug的后台使用VueElement组件库开发的脚手架

    Python在DevOps领域广泛使用,因其简洁的语法和强大的库支持,如Django、Flask等Web框架,以及Ansible、SaltStack等自动化工具,使得Python成为了运维自动化的重要语言。 Vue.js Element UI组件库则为该项目提供了...

Global site tag (gtag.js) - Google Analytics