django搜索条件过滤方法与思路

版权声明:学习是一种信仰。喜欢就拿去,送人玫瑰手有余香。 https://blog.csdn.net/huoyuanshen/article/details/83308899

思路:form中get提交,后端获取,过滤掉不用的参数,剩下的组拼filter。

扩展:在heml定义规则标记,如__like结果,后端过滤__like标记,组拼filter,避免排除法遗漏导致查询错误。

1,前端样式与代码

<div class="col-sm-2">
    <input class="form-control input-sm" type="text"
           name="PrivateIpAddresses__icontains"
           placeholder="内网IP" style=""/>
</div>

__icontains 表示忽略大小写

2,跳转url代码:

path('ecs.html', views.EcsListAll.as_view(), name='ecs_list'),

3,views后代代码

class EcsListAll(LoginRequiredMixin, ListView):
    template_name = 'asset/ecs.html'
    model = Ecs

    queryset = Ecs.objects.all()
    ordering = ('-id',)

    def get_context_data(self, **kwargs):
        try:
            page = self.request.GET.get('page', 1)
        except p1 as e:
            page = 1
            logger.error(e)
            
        p = p2(self.queryset, getattr(settings, 'DISPLAY_PER_PAGE'), request=self.request)
        
        asset_list = p.page(page)

        context = {
            "ecs_list": asset_list,
            'ecs_count':self.queryset.count()  if self.queryset != '' else  0,
        }
        kwargs.update(context)
        return super().get_context_data(**kwargs)

    def get_queryset(self):
        self.queryset = EcsQuerysetHandle(self.request)
        return self.queryset

EcsQuerysetHandle方法代码:

def EcsQuerysetHandle(request):
    user = User.objects.get(username=request.user)
    groups = [x['name'] for x in request.user.groups.values()]
    groups_update = []

    filter_dict = {}
    for i in groups:
        if re.search('审批组', i) or re.search('IT运维', i):
            groups_update.append(i)

    for k, v in dict(request.GET).items():
        if user.is_superuser or 'IT运维' in groups:
            if [i for i in v if i != ''] and (k != 'page' and k != 'order_by' and k != 'csrfmiddlewaretoken'):
                if '__in' in k:
                    filter_dict[k] = v
                else:
                    filter_dict[k] = v[0]
        else:
            if [i for i in v if i != ''] and (k != 'page' and k != 'order_by' and k != 'csrfmiddlewaretoken'):
                if '__in' in k:
                    filter_dict[k] = v
                elif k == 'ServiceBusiness':
                    if v[0] in groups_update:
                        filter_dict['ServiceBusiness'] = v[0]
                else:
                    filter_dict[k] = v[0]

    if filter_dict == {}:
        if user.is_superuser or 'IT运维' in groups:
            queryset = Ecs.objects.all()
        elif groups_update:
            filter_dict['ServiceBusiness__in'] = groups_update
            queryset = Ecs.objects.filter(**filter_dict)
        else:
            queryset = ''
    else:
        queryset = Ecs.objects.filter(**filter_dict)

    order_by_val = request.GET.get('order_by', '')
    if order_by_val:
        queryset = queryset.order_by(order_by_val) if queryset else queryset

    return queryset

猜你喜欢

转载自blog.csdn.net/huoyuanshen/article/details/83308899