Использование 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)
Другие вопросы по тегам