1. 程式人生 > >django搜尋條件過濾方法與思路

django搜尋條件過濾方法與思路

思路: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