组合筛选组件

<div class="col-sm-3">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <i class="fa fa-search" aria-hidden="true"></i>筛选
                </div>
                <div class="panel-body filter-area">
                {% for item in filter_list %}
                    <div class="item">

                        <div class="title">{{ item.title }}</div>
                        <div class="check-list"  style="width: 100%">
                            {% for foo in item.filter %}
                                {{ foo }}
                            {% endfor %}
                         </div>

                    </div>
                {% endfor %}

                </div>
            </div>
        </div>
前端展示

 

class checkboxFilter():

    def __init__(self,name,choices,request):
        self.request = request
        self.name = name
        self.choices = choices

    def __iter__(self):
        for item in self.choices:
            k = str(item[0])
            text = item[1]

            query_dict = self.request.GET.copy()
            query_dict._mutable = True
            value_list = self.request.GET.getlist(self.name) #获取当前筛选的选项,在生成url时把已选的值在列表中去掉
            ck = ""
            if k in value_list:
                ck = "checked"
                value_list.remove(k)
            else:
                value_list.append(k)
            if "page" in query_dict:
                query_dict.pop("page")
            query_dict.setlist(self.name,value_list)
            param_url = query_dict.urlencode()
            url = "{}?{}".format(self.request.path_info,param_url)
            tpl = "<a class='cell' href={url}><input type='checkbox' {ck} /> <lable>{text}</lable></a>"
            html = tpl.format(text=text,ck=ck,url=url)
            yield mark_safe(html)

class selectFilter():

    def __init__(self,name,choices,request):
        self.request = request
        self.name = name
        self.choices = choices

    def __iter__(self):
        yield mark_safe("<select class='select2' multiple style='width:100%;' >")
        for item in self.choices:
            k = str(item[0])
            text = item[1]

            query_dict = self.request.GET.copy()
            query_dict._mutable = True
            value_list = self.request.GET.getlist(self.name) #获取当前筛选的选项,在生成url时把已选的值在列表中去掉
            ck = ""
            if k in value_list:
                ck = "selected"
                value_list.remove(k)
            else:
                value_list.append(k)

            if "page" in query_dict:
                query_dict.pop("page")

            query_dict.setlist(self.name,value_list)
            param_url = query_dict.urlencode()
            url = "{}?{}".format(self.request.path_info,param_url)
            tpl = "<option value={url} {ck}>{text} </option>"
            html = tpl.format(text=text,ck=ck,url=url)
            yield mark_safe(html)
        yield mark_safe("</select>")
checkbox select筛选类
def issues(request,project_id):
    if request.method=="GET":
        # 根据url筛选
        condition = {}
        allow_filter_list = ["status","priority","issue_type","pattern","assign","watcher"]
        for item in allow_filter_list:
            value_list = request.GET.getlist(item)
            if not value_list:
                continue
            condition["{}__in".format(item)] = value_list
        queryset = models.Issues.objects.filter(project_id=project_id).filter(**condition)
        page_object = Pagination(
            current_page=request.GET.get('page'),
            all_count=queryset.count(),
            base_url=request.path_info,
            query_params=request.GET,
            per_page=5,
        )
        issues_object_list = queryset[page_object.start:page_object.end]
        form = issue.issuesForm(request)
        #邀请码表单验证
        invite_form = issue.inviteModelForm()

        issue_type_choices = models.IssueType.objects.filter(project_id=project_id).values_list("id","title")
        project_userlist = [(request.tracer.user.id,request.tracer.user.username)]
        projectUser = models.ProjectUser.objects.filter(project_id=project_id)
        project_userlist.extend(projectUser)

        context = {
            'issues_object_list': issues_object_list,
            'page_html': mark_safe(page_object.page_html()),
            "form": form,
            "invite_form": invite_form,
            "filter_list":[
                {"title": "问题类型", "filter": checkboxFilter("issue_type", issue_type_choices, request)},
                {"title":"问题状态","filter":checkboxFilter("status",models.Issues.status_choices,request)},
                {"title":"优先级","filter":checkboxFilter("priority",models.Issues.priority_choices,request)},
                {"title":"模式","filter":checkboxFilter("pattern",models.Issues.pattern_choices,request)},
                {"title":"指派者","filter":selectFilter("assign",project_userlist,request)},
                {"title":"关注者","filter":selectFilter("watcher",project_userlist,request)},
            ]
        }

        return render(request, "issues.html", context)
视图函数

 

posted on 2020-05-03 18:27  仙人小麦  阅读(225)  评论(0编辑  收藏  举报