zoukankan      html  css  js  c++  java
  • stark组件开发之批量操作

    class UserInfoHandler(StartHandler):
      .......
        # 批量操作功能的列表,添加则显示, 使用此功能。需要将StartHandler.display_checkbox 添加到list_display 中
        action_list = [StartHandler.action_multi_delete, StartHandler.action_multi_init]
      .......
    class StartHandler(object):
      ........
        def action_multi_delete(self, request, *args, **kwargs):
            '''批量删除( 如果想要定制,执行成功后的返回值,那么就为这个函数,设置返回值就可以)'''
            self.model_class.objects.filter(pk__in=request.POST.getlist("pk")).delete()
            # return redirect("http://www.baidu.com")
        action_multi_delete.text = "批量删除"
    
        # 用户自定制,是否使用该功能。 只要在子类中的 action_list=[StarkHandler.multi_init] 就可以使用该功能
        def action_multi_init(self, request, *args, **kwargs):
            '''批量初始化'''
            pass
        action_multi_init.text = "批量初始化"
        # 如果像模板中,传递一个函数的话,他就会自动的执行一边。 从而前端的页面也因为这个原因,拿不到 text 的值。
        # 所以就需要在后端把这个 action_list 处理成一个字典。这件事由基类完成 {func.__name__: func.text for func in action_list}
    
        def get_list_display(self):
           ........
    
            # ####################1. 处理 Action ######################
            action_list = self.get_action_list()
            action_dict = {func.__name__: func.text for func in action_list}  # func.__name__获取函数名, func.text获取函数文本
            if request.method == "POST":
                action_func_name = request.POST.get("action")
                if action_func_name and action_func_name in action_dict:  # 前端发送过来的name 必须要在 action_dict中。
                    action_respons = getattr(self, action_func_name)(request, *args, **kwargs)
                    if action_respons:
                        return action_respons
          .........
    
          return render(request, "stark/changelist.html",
                          {"header_list": header_list, "data_list": data_list,
                           "body_list": body_list,
                           "pager": pager,
                           "add_btn": add_btn,
                           "search_list": search_list,
                           "search_value": search_value,
                           "action_dict": action_dict})
    
        action_list = []
        def get_action_list(self):
            return self.action_list
    D:prev_new_starkstarkserversstart_v1.py

    标红位置的, 部分就是。 处理此批量操作的。 功能:

    {% extends "layout.html" %}
    {% block content %}
    .......
    <form action="" method="post"> {% csrf_token %} {% if action_dict %} <div style="float: left; margin: 0 10px 5px 0"> <div class="form-inline"> <div class="form-group"> <select name="action" id="" class="form-control"> <option value="">请选择操作</option> {% for func_name, func_text in action_dict.items %} <option value="{{ func_name }}">{{ func_text }}</option> {% endfor %} </select> <input type="submit" name="" value="执行" class="btn-success btn"> </div> </div> </div> {% endif %} {% if add_btn %} <div style="float: left">{{ add_btn|safe }}</div> {% endif %} <table class="table table-bordered"> <thead> <tr> {% for head in header_list %} <th>{{ head }}</th> {% endfor %} </tr> </thead> <tbody> {% for row in body_list %} <tr> {% for ele in row %} <td>{{ ele }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table> </form> </div> ...... {% endblock %}

    此部分, 使用的知识点:

    # 如果向模板中,传递一个函数的话,他就会自动的执行一边。 从而前端的页面也因为这个原因,拿不到 text 的值。
    # 所以就需要在后端把这个 action_list 处理成一个字典。这件事由基类完成 {func.__name__: func.text for func in action_list}

    {func.__name__: func.text for func in action_list}
    简单的字典生成式。
    action_list 中循环出,每一个函数对象。  func.__name__ 获取这个函数的函数名。 func.text 获取这个函数的文本信息!
    前端中:

    {% for func_name, func_text in action_dict.items %}
         <option value="{{ func_name }}">{{ func_text }}</option>
    {% endfor %}
    使用  items 方法。  获取到, 字典中的  key 和 value。  也就是函数名, 和函数文本。

    POST 提交时,将 函数名,提交给后台。 后台通过反射的 方式。 找到这个 函数。 并执行。

    并且 该函数, 也可以有返回值。 自定制批量操作成功,之后 可以跳转到,那个页面。

  • 相关阅读:
    Git 命令使用小笔记
    一个关于if else容易迷惑的问题
    浏览器与Node环境下的Event Loop
    镜面反射
    Socket通信原理
    Git
    vba工具
    为什么要用prototype
    Oracle 列转换为行, 逗号拼接.
    JS中的phototype
  • 原文地址:https://www.cnblogs.com/chengege/p/10742937.html
Copyright © 2011-2022 走看看