我有一个 django Listview,我正在使用 django-el-pagination 的 ajax 无休止的分页来对我的结果进行分页,并且效果很好。问题是我需要对其应用一些过滤器并且不知道如何去做。
我可以通过 GET 将参数发送到视图吗?搜索了很多,似乎以前没有人遇到过这个问题。
我有一个 django Listview,我正在使用 django-el-pagination 的 ajax 无休止的分页来对我的结果进行分页,并且效果很好。问题是我需要对其应用一些过滤器并且不知道如何去做。
我可以通过 GET 将参数发送到视图吗?搜索了很多,似乎以前没有人遇到过这个问题。
数据总是在get_queryset()
函数中返回。
如果你想简单地从数据库中过滤,你可以只返回对象。
class IndexView(AjaxListView):
template_name = '****'
context_object_name = '****'
page_template = '****'
def get_queryset(self):
return your_model.objects.filter(title='***').order_by('**')
否则,如果您想从非数据库中获取数据,则需要根据此答案实现代理。
如果没有,分页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
...
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)
无休止的分页应该可以正常工作。 使用带有 django-endless-pagination 的过滤器