2009-08-11 3 views
3

Я использую общие представления Django для создания сайта блога. Созданные мной шаблоны, entry_archive_day, entry_archive_month, entry_archive, и entry_detail все работает отлично.Общий вид 'archive_year' создает пустую страницу

Но entry_archive_year нет. Вместо этого он просто действует страница без содержания (а не 404 или другой ошибки. Похоже, что не видит объекты в **object_list**.

Я знаю, что archive использует latest список вместо object_list, , но это не ?! в случае с archive_year, правильно

Благодаря

ответ

5

Чтобы решить вашу проблему:

Если вы установили make_object_list=True при вызове archive_year, то список объектов за этот год будет доступен как object_list.

Как простой пример, если ваш шаблон URL выглядит

url(r'^(?P<year>\d{4})/$', 'archive_year', info_dict, name="entry_archive_year") 

где info_dict представляет собой словарь, содержащий queryset и date_field, измените его на

url(r'^(?P<year>\d{4}/$', 'archive_year', dict(info_dict,make_object_list=True), 
     name="entry_archive_year") 

Объяснение:

Общий вид archive_year имеет дополнительный rgument make_object_list. По умолчанию установлено значение false, а object_list передается шаблону в виде пустого списка.

make_object_list: Логическое значение, указывающее, следует ли получить полный список объектов за этот год и передать их в шаблон. Если True, этот список объектов станет доступным для шаблона как object_list. (Название object_list может отличаться, см. Документы для object_list в разделе «Шаблон контекста» ниже.) По умолчанию это False.

Причина в том, что вы не всегда можете отображать список всех объектов в представлении entry_archive_year. У вас могут быть сотни сообщений в блогах за этот год, слишком много для отображения на одной странице.

archive_year см. Иллюстрации для использования в шаблоне. Это позволяет создавать ссылки на ежемесячные архивные страницы того года, за месяцы, в которых есть записи.

date_list: Список datetime.date объектов, представляющих все месяцы, которые имеют объекты, доступные в данном году, в соответствии с QuerySet, в порядке возрастания.

Более подробная информация содержится в документе Django docs.

В соответствии с просьбой в комментарии ниже, пример того, как использовать date_list:

Чтобы использовать date_list, ваш entry_archive_year шаблон будет содержать что-то вроде этого:

<ul> 
    {% for month in date_list %} 

    <li><a href="/blog/{{month|date:"Y"}}/{{month|date:"b"}}> 
      {{month|date:"F"}}</a></li> 
    {% endfor %} 
</ul> 

Обратите внимание, что я hardcoded url - на практике было бы лучше использовать url template tag. Пример date_list используется в дикой природе, посмотрите на Django Weblog 2009 Archive.

+0

Отлично! Благодарим вас за ваш быстрый и четко сформулированный ответ. Я не был уверен, как передать настройку с urls.py, но нашел этот пример: http://github.com/garethr/django-train/blob/ed60ace848e39d2d007929b2316d090886887a57/src/train/urls.py Как после этого, у вас есть ссылка на хороший пример с использованием date_list? –

+0

Я добавил пример, показывающий, как изменить urls.py в случае, если кто-то еще имеет такую ​​же проблему в будущем, и написал немного больше о 'date_list'. – Alasdair

+0

Еще раз спасибо за подробный пост и последующие действия. –

Смежные вопросы