2017-01-22 42 views
2

我有一個django Listview,我使用django-el-pagination的ajax無盡的分頁來對我的結果進行分頁並且效果很好。問題是我需要應用一些過濾器,並不知道如何去做。如何使用django-el-pagination進行過濾?

我可以通過GET發送參數到視圖嗎?搜索了很多,似乎以前沒有人遇到過這個問題。

回答

-1

AjaxListView使用的列表對象由get_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 
     ...