(2019-1-18)Django - 对表格中的数据执行批量操作(stark组件)

上面这种对表格数据的批量操作,在我们后台操作中是很常见的,来看下实现流程。
1.先构建前端的select标签和提交按钮
select的option标签中的功能需要从后端进行构建并返回。
由于是基于stark组件进行开发,是在stark基础上添加该功能,设计思路如下:
1.默认所有的查看数据页面都有批量操作功能,并且默认拥有批量删除的功能。
2.根据不同业务的功能,在app独立的stark.py的配置类中设计独有的批量操作功能,
3.功能点:查看页面加载时,option需要同时动态加载;默认批量操作和自定义批量操作,不同业务视图显示不同批量操作功能。
代码实现:
from django.test import TestCase # Create your tests here. class ModelStark(object): """ 默认配置类 """ # ..... actions = [] def __init__(self, model): self.model = model def path_delete(self, pklist): """ 公有的批量删除功能 :param pklist: :return: """ for i in pklist: self.model.objects.filter(pk=i).delete() def get_actions(self): """ 构建批量操作select option数据 :return: """ action_data = {} # 默认添加批量删除操作 self.actions.append('path_delete') for action in self.actions: action = getattr(self, action) action_data[action.__name__] = action.desc return action_data def list_view(self, request): """ 查看视图 :param request: :return: """ if request.method == "POST": action_name = request.POST.get('action') pk_list = request.POST.getlist('pk_list') # 执行批量操作 action = getattr(self, action_name)(pk_list) # current_page_num = request.GET.get('page', 1) # # 分页数据,表格体数据,计数 # page_html, data_list, counter = self.get_tbody(request, current_page_num) # # 表格头部数据 # header_list = self.get_theader() # # 添加按钮路由数据 # add_url = self.add() # # 搜索框是否显示 # search_status = self.search_fields # 批量操作option数据 action_data = self.get_actions() return render(request, 'list_view.html', locals())
from awsstark.services.sites import site, ModelStark from adminDemo.models import Book, Publish, Author, AuthorDetail from django.utils.safestring import mark_safe class BookConfig(ModelStark): list_display = ['checkbox', 'title', 'price', 'publish', 'publishDate', 'authors', 'web_ssh', 'edit', 'delete'] list_display_links = ['title', 'price'] search_fields = ['title', 'price'] actions = ['path_update_price'] def web_ssh(self, obj=None): if obj: return mark_safe("<a href="">web_shh</a>") return '登录服务器' def path_update_price(self, pk_list): """ 批量价格初始化方法 :param pk_list: :return: """ for pid in pk_list: self.model.objects.filter(pk=pid).update(price=66) path_update_price.desc = '价格初始化(66)' site.register(Book, BookConfig)
前端代码,这里将select和table放在一个form,form会默认将select选中的值和选中checkbox的值组成请求体数据发送post请求,然后后端进行处理。
<form action="" method="post"> {% csrf_token %} <div> <select name="action" id="" class="form-control" style="display: inline-block;width: 300px;margin: 10px 0 10px 0"> <option>----请选择操作------</option> {% for func,desc in action_data.items %} <option value="{{ func }}">{{ desc }}</option> {% endfor %} </select> <button type="submit" class="btn btn-danger">执行</button> </div> <table class="table table-striped table-bordered table-hover"> ............. </tbody> </table> </form>
前端checkbox,全选,全不选jquery
<script src="/static/js/jquery-3.3.1.min.js"></script> <script> $(function () { $('#choose').click(function () { if (this.checked) { $('.item_checkbox').prop('checked',true) } else { $('.item_checkbox').prop('checked',false) } }) }) </script>
浙公网安备 33010602011771号