2017-01-22 4 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('**') 

あなたは非データベースからデータを取得したい場合、あなたはthis answerにaccorddingプロキシを実装する必要があります。

もしそうでなければ、ページネーション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 
     ... 
関連する問題