#django #blogs #archive
#django #Блоги #Архив
Вопрос:
Я просто пытаюсь перечислить свои сообщения в блоге за определенный месяц в определенном году, но ни одно из моих сообщений не отображается. Когда я ввожу правильный URL: 2011 / ноябрь, сообщения не отображаются, и у меня есть сообщения за ноябрь 2011, сохраненные в моем администраторе.
Кроме того, по какой-то причине мой файл css не учитывается. Когда я перехожу к URL, 2011 / ноябрь, я просто получаю html без оформления и ни одного из моих сообщений. Что я здесь делаю не так?
#models.py
class Post(models.Model):
title = models.CharField(max_length=120)
slug = models.SlugField(max_length=120, unique = True)
body = models.TextField()
published = models.DateTimeField(default=datetime.now)
categories = models.ManyToManyField(Category)
def __unicode__(self):
return self.title
#urls.py
info_dict = {
'queryset': Post.objects.all(),
'date_field': 'published',
}
urlpatterns = patterns('',
(r'^(?P<year>d{4})/(?P<month>[a-z]{3})/$',
date_based.archive_month,
dict(info_dict, template_name='blog/archive.html',)),
#blog/archive.html
<link href="../static/style.css" rel="stylesheet" type="text/css" media="screen" />
.
.
.
{% for post in post_list %}
<h3 class="title"><a href="{% url single_post slug=post.slug %}">{{post.title}}</a>
</h3>
{% endfor %}
Ответ №1:
-
CSS не отображается , потому что вы определяете его относительно быть
../static/style.css
. Когда адрес является/2011/jan
, браузер пытается получить CSS из/2011/static/style.css
. Исправление: установите путь как абсолютный:/static/style.css
. -
Вы должны выполнять цикл через вызываемый объект
object_list
вместоpost_list
.{% for post in object_list %}
Комментарии:
1. Спасибо! Сейчас это работает, но почему я должен ссылаться на это как object_list? Я попытался установить ‘template_object_name’:’post_list’, но это тоже не работает.
Ответ №2:
Контекстная переменная, которая содержит сообщение, называется object_list, а не post_list, поэтому вы должны иметь:
{% for post in object_list %}
...
{% endfor %}
Ваш CSS-файл должен быть:
и если вы разрабатываете локально, вам необходимо настроить сервер разработки для размещения ваших носителей для вас:
https://docs.djangoproject.com/en/dev/howto/static-files/#using-django-contrib-staticfiles
Ответ №3:
В дополнение к тому, что написал pastylegs выше, вам также следует изменить эту строку
published = models.DateTimeField(default=datetime.now)
к этому:
published = models.DateTimeField(auto_now_add=True)
В Python именованные аргументы оцениваются только один раз. Это означает, что published
значением по умолчанию является время, когда ваш сервер в последний раз компилировал models.py
файл. Django предлагает решение этой проблемы: установка параметра auto_now_add=True
заставляет django использовать фактическое текущее время для поля, когда оно впервые создано. Аналогично, настройка auto_now=True
заставляет django устанавливать текущее время для поля всякий раз, когда оно сохраняется.