Использование django-endless-pagination с пользовательским представлением на основе c, расширяющим ListView
Читая Django-endless-pagination's Docs, он говорит, что вы можете расширить его функциональность Ajax- пейджинга для представлений на основе классов просто с помощью декоратора @page_template()... Я пытался реализовать этот декоратор около часа, используя:
class ExtendedListView(ListView):
template_name = 'global_template.html'
@method_decorator(@page_template('path_to_updatable_content_only_template'))
def dispatch(self, *args, **kwargs):
return super(ExtendedListView, self).dispatch(*args, **kwargs)
Функции представления не выдают никаких ошибок, но когда я перехожу на другую страницу, он загружает 'global_template' в цель, а не шаблон, определенный в декораторе.
Если кто-нибудь знает, действительно ли работает эта реализация, и я делаю какую-то ошибку, пожалуйста, укажите на это, я буду рад использовать ее правильно.
Мне удалось придумать обходной путь, поэтому, если у кого-то возникла такая же проблема, и на этот вопрос нет подходящего ответа, вы можете сделать это:
class ExtendedListView(ListView):
template_name='global_template_path'
'''
render_to_response ¿hack? so that i can render only the updatable DOM part template
'''
def render_to_response(self, context):
if self.request.is_ajax():
self.template_name = 'path_to_updatable_content_only_template'
return super(ExtendedListView, self).render_to_response(context)
else:
return super(ExtendedListView, self).render_to_response(context)
Ура!
2 ответа
Официально вы можете использовать AjaxListView для выполнения этой задачи:
# views.py
from endless_pagination.views import AjaxListView
class BookView(AjaxListView):
context_object_name = "books"
model = Book
template_name = 'books.html'
page_template = 'books_list.html'
в book.html:
{% extends 'base.html' %}
{% block js %}
{{ block.super }}
<script src="/static/js/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/static/js/endless.js" type="text/javascript" charset="utf-8"></script>
{% endblock %}
{% block content %}
<div class="endless_page_template">
{% include page_template %}
</div>
{% endblock %}
и это books_list.html
{% load endless %}
{% paginate books %}
{% for book in books %}
{{ book.title }}
{% endfor %}
<div class="pagination">
{% show_pages %}
</div>
Это на самом деле довольно запутанно, как работает реализация Ajax. Мне пришлось развернуть свое собственное решение, потому что я хотел использовать общие представления, Ajax и множественную нумерацию страниц. Чтобы выяснить, как заставить его работать, мне пришлось перепроектировать код из примеров, декораторов django-endless-pagination и самих представлений Django. В процессе развертывания своего собственного решения я немного упростила ситуацию, но, вероятно, ее можно упростить еще больше. Возможно, это может быть полезно кому-то еще:
class SearchView(View):
"""
Based on code from django-endless-pagination, modified for multiple
pagination views on the same page
"""
template = 'app/search.html'
page_templates = {'object1Page': 'app/search_object1_pane.html',
'object2Page': 'app/search_object2_pane.html'}
def get_context_data_and_template(self, **kwargs):
context = {'params': kwargs}
# Check whether AJAX has made a request, if so, querystring_key will be
# set, identifying which paginator to render
querystringKey = self.request.REQUEST.get('querystring_key')
template = self.page_templates.get(querystringKey)
# switch template on ajax requests
if not (self.request.is_ajax() and template):
template = self.template
context['page_template'] = template
# Always generate the QuerySets that will be paginated
if self.request.GET['query']:
searchTerm = self.request.GET['query']
else:
searchTerm = kwargs['search']
# *** Insert your search code here ***
context['object1Results'] = object1QuerySet
context['object2Results'] = object2QuerySet
extraContext = self.kwargs.get("extra_context", {})
context.update(extraContext)
return context, template
def get(self, request, *args, **kwargs):
context, template = self.get_context_data_and_template(**kwargs)
return TemplateResponse(request=self.request,
template=template,
context=context)