2

私は、publication_date フィールドと is_published フィールドを持つ Django モデルを持っています。このモデルのマネージャーを作成しました。これは公開されたすべてのアイテムを返します。つまり、is_published=True で、publication_date <= now を持つすべてのアイテムです。

class PublishedTextManager(models.Manager):
    """
        Filters out all unpublished items and items with a publication date in the future
    """
    def get_query_set(self):
        return super(PublishedTextManager, self).get_query_set() \
            .filter(is_published=True) \
            .filter(publication_date__lte=timezone.now())

このマネージャーを使用しているビューは次のようになります。

class NewsAndEventsOverView(ListView):

    model = News
    queryset = News.published.all().order_by('-publication_date')
    context_object_name = 'news_list'

    def get_context_data(self, **kwargs):
        # Initialize context and fill it with default data from NewsAndEventsOverView super class
        context = super(NewsAndEventsOverView, self).get_context_data(**kwargs)
        # Add view specific context
        context['latest_news_item'] = context['news_list'][0]
        today = timezone.now()
        yesterday = today - timedelta(days=1)
        context['upcoming_events_list'] = Event.published.filter(Q(date_end__gt=yesterday) | Q(date_start__gt=yesterday)).order_by('date_start')
        past_events_list = Event.published.filter(Q(date_end__lt=today) | Q(date_start__lt=today)).order_by('-date_start')
        old_news_list = context['news_list'][1:]
        context['old_news_and_events_list'] = sorted(chain(old_news_list, past_events_list), key=lambda x: x.publication_date, reverse=True)
        return context

関連する urls.py:

from .views import NewsAndEventsOverView

urlpatterns = patterns('',
    # Index page
    url(r'^$', NewsAndEventsOverView.as_view(), name="newsandevents_overview"),
)

デフォルトでニュース項目を追加すると、現在の日時 (timezone.now()) を発行日として受け取りますが、ページを更新すると、サーバーを再起動するまでフロントエンドに表示されません (django built を使用) - サーバー atm 内)。私はアムステルダム時間 (+2:00) にいて、publication_date フィルターに 2 時間を追加すると問題なく動作するので、日時の認識に慣れていないので、何か間違ったことをしていると思います。ブラケットの有無にかかわらず timezone.now を試しましたが、違いはありません。

4

2 に答える 2

2

モデルに次のようなものがあることは 99% 確信しています。

class News(models.Model):
    ....
    publication_date = models.DateTimeField(default=timezone.now())
    ....

これが実際に行うことは、新しいオブジェクトを作成するたびに呼び出されるオブジェクトとして関数を渡す代わりに、キーワード引数 'default' に値を与えることです。そして、関数「timezone.now」を渡したいが、この関数の値ではなく、「timezone.now()」になります

これを次のように変更します。

class News(models.Model):
    ....
    publication_date = models.DateTimeField(default=timezone.now)
    ....

そして、デフォルトの timezone.now 値を DateTimeField に与えたいコードのすべての場所にこれを適用することを忘れないでください

チーズ!この回答が役に立った場合は、忘れずに賛成票を投じてください。;)

于 2013-08-29T11:31:17.530 に答える
1

私は同様の問題に遭遇しており、これが私が起こっていると思うことです。querysetclass 属性を使用すると、クエリはリクエストごとに実行されますがtimezone.now()、Manager 内の呼び出しはリクエストごとに実行されるのではなく、クラスのインスタンス化時にのみ実行されます。代わりに get_queryset メソッドを使用してみてください。これにより、リクエストごとに強制的に実行されます。

class NewsAndEventsOverView(ListView):

    model = News
    context_object_name = 'news_list'

    def get_queryset(self):
        return News.published.all().order_by('-publication_date')

    ...
于 2013-10-13T03:03:26.620 に答える