我有一個django Listview,我使用django-el-pagination的ajax無盡的分頁來對我的結果進行分頁並且效果很好。問題是我需要應用一些過濾器,並不知道如何去做。如何使用django-el-pagination進行過濾?
我可以通過GET發送參數到視圖嗎?搜索了很多,似乎以前沒有人遇到過這個問題。
我有一個django Listview,我使用django-el-pagination的ajax無盡的分頁來對我的結果進行分頁並且效果很好。問題是我需要應用一些過濾器,並不知道如何去做。如何使用django-el-pagination進行過濾?
我可以通過GET發送參數到視圖嗎?搜索了很多,似乎以前沒有人遇到過這個問題。
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
數據總是在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
...