2017-01-22 3 views
2

У меня есть django Listview, и я использую django-el-pagination ajax бесконечную разбивку на страницы, чтобы разбивать мои результаты, и это хорошо работает. Проблема в том, что мне нужно применить к нему некоторые фильтры и не иметь понятия о том, как это сделать.Как использовать django-el-pagination с фильтрацией?

Могу ли я отправлять параметры через GET в представление? Много раз искали и, похоже, никто раньше не сталкивался с этой проблемой.

ответ

-1

Объект списка, используемый AjaxListView, определяется методом get_queryset(). Для фильтрации QuerySet на основе ввода пользователей, вы можете обратиться к методу POST:

from app.forms import BlogFilterForm 

class Blog(LoginRequiredMixin, AjaxListView): 
    context_object_name = "posts" 
    template_name = 'blog/blog.html' 
    page_template = 'blog/post_list.html' 
    success_url = '/blog' 

    def get_queryset(self): # define queryset 
     queryset = Post.objects.all() # default queryset 
     if self.request.method == 'POST': # check if the request method is POST 
      form = BlogFilterForm(self.request.POST) # define form 
      if form.is_valid(): 
       name = form.cleaned_data['name'] # retrieve data from the form 
       if name: 
        queryset = queryset.filter(name=name) # filter queryset 
     else: 
      queryset = queryset 
     return queryset 

    def get_context_data(self, **kwargs): 
     context = super(Blog, self).get_context_data(**kwargs) 
     context['form'] = BlogFilterForm() # define context to render the form on GET method 
     return context 

    def post(self, request, *args, **kwargs): # define post method 
     return super(Blog, self).get(request, args, kwargs) 

Бесконечная пагинация должно работать нормально. using filters with django-endless-pagination

0

Данные всегда возвращаются в функции get_queryset().

Если вы хотите просто фильтровать из базы данных, вы можете просто вернуть объекты.

class IndexView(AjaxListView): 
    template_name = '****' 
    context_object_name = '****' 
    page_template = '****' 

    def get_queryset(self): 
     return your_model.objects.filter(title='***').order_by('**') 

Иначе, если вы хотите получить данные из не-баз данных, вам нужно реализовать прокси Accordding в this answer.

Если нет, то ajax разбиения на страницы запрашивает все данные, а затем разрезает его. Прокси делает ваши данные разрезанными во время запросов.

Это мой фильтр, который получает данные от ElasticSearch.

class IndexView(AjaxListView): 
    template_name = '****' 
    context_object_name = '****' 
    page_template = '****' 

     def get_queryset(self): 
    params = {} 
    # get query params 
     for item in self.request.GET.items(): 
      if item[0] == 'page' or item[0] == 'querystring_key': 
       continue 
      params[item[0]] = item[1] 

     # no filter 
     if len(params) == 0: 
      return ****.objects.filter().order_by('-date') 

     else: 
      return ESResult(params) 

class ESResult(object): 

    def __init__(self, params): 
     self.params = params 

    def __len__(self): 
     s = self.search_es() 
     if s: 
      s = s[:1] 
      r = s.execute() 
      return r['hits']['total'] 
     else: 
      return 0 

    def __getitem__(self, item): 
     assert isinstance(item, slice) 
     result = [] 
     s = self.search_es() 

     if s: 
      s = s[item.start:item.stop] # slice before querying 
      r = s.execute() 

      for a in r.to_dict()['hits']['hits']: 
       one = a['_source'] 
       one['id'] = int(a['_id']) 
       result.append(one) 

     return result 

    def search_es(): 
     ... 
     # filter request here 
     ... 
Смежные вопросы