Здраствуйте, все!
После сдачи проекта отгреб проблемку.
Небольшой портальчик, несколько разных блоков и лента новостей.
Все работает замечательно, но бывает что после добавления, например, новости (модель ниже),
она не отображается на странице длительное время, вплоть до рестарта/релоада апача
model.py:
class News(models.Model):
title = models.CharField("Заголовок", maxlength=250)
category = models.ForeignKey(NewsCategories, verbose_name="Категория")
preview = models.TextField("Сокращенный вариант")
body = models.TextField("Полный текст")
created = models.DateTimeField("Добавлена", auto_now_add=True)
hot = models.BooleanField("Горячая новость")
views.py кусок для выборки только горячих новостей:
context = {
'hot_news': News.objects.filter(hot=True).order_by('-created')[0],
}
return render_to_response('index.html', context)
пробовал отключать кэш, CACHE_BACKEND = 'dummy:///'
результат тот же
смотрел какие запросы делает джанго в базу, так вот конкретно тех, что не обновляются - нет, корректно обновляются только те блоки, где идет выборка диапазона значений, например:
context["news_list"] = News.objects.filter(hot=False).order_by('-created')[:5]
в какую сторону копать? может это mod_python выпендривается?
джанго выкачал по свн, версия из транка
maxlength и auto_now_add deprecated. # -*- coding: utf-8 -*- в начало файла и u'' для всех не ascii строк.
mod_python вообще ничего не кеширует. Джанго объект из базы достает всегда? В шаблон он передается? В шаблоне нет каких-нибудь хитрых хаков при выводе?
Как вариант попробуйте: News.objects.filter(hot=True).order_by('-created')[0:1].get()
maxlength заменил на max_length, про auto_now и auto_now_add толком ничего не нашел :(
джанго не всегда достает объекты, в том и проблема
на гугле в группе django-users вот что мне ответили:
>When launched, mod_python loads your code once and only once for each
server process, and holds it in memory afterward. This is a trade-off
made or efficiency, because reloading the code on every request would
significantly slow the server. As a result, whenever you make a change
to code that runs under mod_python, you must also restart the web
server.
>In addition, any variable assigned at the module global level will
only be evaluated once, which means that any top-level variable
declaration which does a database query will only evaluate once per
server process, rather than appearing to refresh on each request.
я так понял, все проблема в том, что я определил словарь context глобально... не хотелось множить один и тот же код для каждой вьюхи
Да, проблема именно в глобальности вашего context.
auto_now_add всегда была глючной штукой и ее давно планируют выкинуть
http://groups.google.com/group/django-developers/browse_thread/thread/4cd631c22
5cb4e52
Правильно теперь делается так:
import datetime
created = models.DateTimeField("Добавлена", default=datetime.datetime.now)
Если у вас News в большинстве случаев сортируется по '-created', то выгодно задать ее сортировкой по-умолчанию:
class News(models.Model):
class Meta:
ordering = ('-created',)
Вью:
from django.shortcuts import render_to_response
from django.template.context import RequestContext
def index(request):
context = RequestContext(request, {
'hot_news': News.objects.filter(hot=True)[0],
'last_radio_message': VisualRadio.objects.all()[0],
'last_totals': Totals.objects.all()[0],
'last_poll': Poll.objects.all()[0],
'news_list': News.objects.filter(hot=False)[:5]
}
return render_to_response('index.html', context)
Если у вас context постоянно повторяется, то выделите в отдельную функцию, сделайте context processor
http://www.djangoproject.com/documentation/templates_python/#subclassing-contex
t-requestcontext (и в гугле) или даже вообще свой тег.
А еще посмотрите в сторону http://www.djangoproject.com/documentation/generic_views/#django-views-generic-
simple-direct-to-template