#python #django #pagination #django-pagination
#python #django #разбивка на страницы #django-разбивка на страницы
Вопрос:
Я создаю шаблон для сайта Django (это база данных цитат). Я хочу иметь нумерацию страниц, подобную Digg. Тем не менее, автор приложения создал свою собственную разбивку на страницы, к сожалению, без нумерации страниц (только ссылки «предыдущий» и «следующий»). Итак, я установил django-pagination, но я не могу использовать его с сайтом. Я совершенно новичок в Django, даже в программировании — я всего лишь простой веб-дизайнер… Хорошо, поехали.
Существует оригинальный сценарий: https://bitbucket.org/fleg/fqdb /
Первое, что связано с обработчиками контекста шаблона. Мой settings.py у меня не было этого раздела, поэтому я добавил его точно так же, как в документации по разбивке на страницы django. Когда я запускаю сайт, я получаю сообщение об ошибке: «Поместите’django.contrib.auth.context_processors.auth’ в ваш параметр TEMPLATE_CONTEXT_PROCESSORS, чтобы использовать приложение администратора». Итак, как я должен это заказать?
Вторая проблема — шаблон. Я использую его точно так же, как в скринкасте:
{% extends "fqdb/base.html" %}
{% load pagination_tags %}
{% block title %}{{ title }}{% endblock %}
{% block content %}
<h1>{{ title }}</h1>
{% if quotes %}
{% autopaginate quotes %}
{% for quote in quotes %}
{% include 'fqdb/quote_body.html' %}
{% endfor %}
{% paginate %}
{% else %}
<p>Brak cytatów.</p>
{% endif %}
{% endblock %}
Но я получаю «Ошибка шаблона: ошибка ключа при рендеринге: запрос». Но… Серьезно, я не знаю, что не так с этим кодом!
Существует разбитое на страницы представление — список цитат. Он работает без разбивки на страницы, поэтому я не думаю, что это проблема, но, возможно.
def list_paged(request, page, order_by_what, title, reverse_name):
hash = get_ip_hash(request)
lista = Quote.objects.filter(accepted = True).order_by(order_by_what)[:]
returnDict = {'quotes': lista, 'title': title, 'hash': hash, 'sidebar': get_sidebar()}
return render_to_response('fqdb/quote_list.html', {'quotes': get_quotes(quotes)}, context_instance=RequestContext(request))
Я изменил его, чтобы не разбивать на страницы, потому что это задача django-pagination. Вы можете найти исходное представление на Bitbucket.
Может быть, вы знаете какие-нибудь лучшие решения для разбивки на страницы?
Комментарии:
1. можете ли вы опубликовать представление, которое отображает этот шаблон?
2. Если вы хотите иметь разбивку на страницы в стиле digg, возможно, стоит попробовать django-endless-pagination !
Ответ №1:
Похоже, вам нужно добавить django.contrib.auth.context_processors.auth
и django.core.context_processors.request
контекстные процессоры к вашим TEMPLATE_CONTEXT_PROCESSORS
настройкам.
До того, как вы определили TEMPLATE_CONTEXT_PROCESSORS
, django использовал бы значение по умолчанию. Похоже, что для части вашего кода требуется auth
процессор, отсюда и ваше первое сообщение об ошибке.
KeyError
Мне кажется, что вам требуется request
процессор.
Попробуйте выполнить следующее в вашем файле настроек:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
#"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
#"django.core.context_processors.static",
#"django.contrib.messages.context_processors.messages")
"django.core.context_processors.request"
)
Я использовал список по умолчанию, приведенный в документах контекста запроса Django 1.3, добавил обработчик запросов и прокомментировал те, которые вам, похоже, не нужны.
Порядок обработчиков контекста шаблона обычно не имеет значения, если они не определяют перекрывающиеся имена переменных.
Комментарии:
1. Чувак, ты тоже только что решил мою проблему! Слава человеку! 1!!! Я застрял на этом в течение часа. Кстати, хотя разбивка на страницы работает, но нет кнопки next или previous?
2. Я рад, что ответ помог, но ему уже пару лет. Вам лучше задать новый вопрос о предыдущей и следующей кнопках.
Ответ №2:
Если объекты передаются из templatetag
def comment_app(context):
objects = Comments.objects.get_tree_for_object(context['content_object'])
return {
'comments_tree': objects,
'request': context['request']
}
register.inclusion_tag('comments/comment_app.html', takes_context=True)(comment_app)
обратите внимание на: ‘request’: context[‘запрос’]
Ответ №3:
{% autopaginate quotes N%}
N
— сколько элементов вам нужно для каждой страницы