欢迎来到Louis的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

(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>

 

posted on 2019-01-18 19:58  Louiszj  阅读(605)  评论(0)    收藏  举报

导航