Я отфильтровываю результаты из моего page_obj в общем представлении, чтобы отображать только записи, опубликованные на том же языке, что и язык, установленный в настоящее время django-cms (http://www.django-cms.org/en/documentation/2.0/i18n/).
Это прекрасно работает, но добавлена поддержка разбиения на страницы Django (http://docs.djangoproject.com/en/1.2/topics/pagination/) приводит к тому, что отфильтрованные результаты по-прежнему учитываются. Так, например, когда есть три результата на английском языке, из десяти результатов и пагинации установлено значение 2, я получу 5 страниц результатов, большинство из которых, конечно, пустые, потому что фильтрация оставшихся семи выполняется в шаблон.
Могу ли я изменить Django Paginator для работы с фильтром в шаблоне с помощью тега шаблона, или мне нужно перестроить свои представления? Если да, то как мне это сделать?
Соответствующий код:
managers.py
def update_queryset(view, queryset, queryset_parameter='queryset'):
'''Decorator around views based on a queryset passed in parameter, which will force the update of the queryset before executing the view.
Related to issue: http://code.djangoproject.com/ticket/8378'''
def wrap(*args, **kwargs):
#Regenerate the queryset before passing it to the view.
kwargs[queryset_parameter] = queryset()
return view(*args, **kwargs)
return wrap
views/entries.py
from django.views.generic.list_detail import object_list
from cmsplugin_publisher.models import Entry
from cmsplugin_publisher.managers import update_queryset
entry_index = update_queryset(object_list, Entry.published.all)
urls/entries.py
from django.conf.urls.defaults import *
from cmsplugin_publisher.models import Entry
from cmsplugin_publisher.settings import PAGINATION, ALLOW_EMPTY, ALLOW_FUTURE
entry_conf_list = {'queryset': Entry.published.all(), 'paginate_by': PAGINATION}
entry_conf = { 'queryset': Entry.published.all(),}
entry_conf_detail = entry_conf.copy()
entry_conf_detail['queryset'] = Entry.objects.all()
urlpatterns = patterns('cmsplugin_publisher.views.entries',
url(r'^$', 'entry_index', entry_conf_list, name='cmsplugin_publisher_entry_archive_index'),
url(r'^(?P<page>[0-9]+)/$', 'entry_index', entry_conf_list, name='cmsplugin_publisher_entry_archive_index_paginated'),
)
urlpatterns += patterns('django.views.generic.list_detail',
url(r'^(?P<slug>[-\w]+)/$', 'object_detail', entry_conf_detail, name='cmsplugin_publisher_entry_detail'),
)
в entry_list.html
{% block content %}
{% for object in object_list %}
{% ifequal object.language current_language %}
..
{% endifequal %}
{% endfor %}
{% if is_paginated %}
<ul id="pagination">
{% if page_obj.has_previous %}
{% ifnotequal page_obj.start_index 1 %}<li><a href="../" title="{% trans 'View Latest Entries' %}">{% trans 'Latest Entries' %}</a></li>{% endifnotequal %}
{% ifequal page_obj.previous_page_number 1 %}{% endifequal %}
{% ifnotequal page_obj.previous_page_number 1 %}
<li><a href="../{{ page_obj.previous_page_number }}/" title="{% trans 'View Earlier Entries' %}">{% trans 'Earlier Entries' %}</a></li>
{% endifnotequal %}
{% else%}
{% endif %}
<li>{% trans 'Page' %} {{ page_obj.start_index }} {% trans 'of' %} {{ paginator.num_pages }} {% trans 'Entries' %}</li>
{% if page_obj.has_next %}
{% ifnotequal page_obj.start_index 1 %}
<li><a href="../{{ page_obj.next_page_number }}/" title="{% trans 'View Older Entries' %}">{% trans 'Older Entries' %}</a></li>
{% endifnotequal %}
{% ifequal page_obj.start_index 1 %}
<li><a href="{{ page_obj.next_page_number }}/" title="{% trans 'View Older Entries' %}">{% trans 'Older Entries' %}</a></li>
{% endifequal %}
{% else%}
{% endif %}
</ul>
{% endif %}
Я был бы признателен за любой свет, который вы, ребята, можете пролить на лучшее решение здесь.