django搜尋條件過濾方法與思路
阿新 • • 發佈:2018-10-31
思路: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