Почему date_based не работает.archive_month в Django 1.3 работает для отображения моих сообщений в блоге?

#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:

  1. CSS не отображается , потому что вы определяете его относительно быть ../static/style.css . Когда адрес является /2011/jan , браузер пытается получить CSS из /2011/static/style.css . Исправление: установите путь как абсолютный: /static/style.css .

  2. Вы должны выполнять цикл через вызываемый объект 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 %}
  

https://docs.djangoproject.com/en/dev/ref/generic-views/?from=olddocs#django-views-generic-date-based-archive-month

Ваш 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 устанавливать текущее время для поля всякий раз, когда оно сохраняется.