私は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('**')
あなたは非データベースからデータを取得したい場合、あなたは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
...