私のブログは Django 1.4.1 で構築されています。ブログは特別なものではなく、ほとんどが Django のチュートリアルや本の例に似ています。データベースは PostgreSQL です。サイトマップ フレームワークなど、できるだけ一般的なものを使用するようにしました。残念ながら、生成されたサイトマップにはタイムゾーンの問題が表示されます。
ブログ エントリ モデルのフィールド「pub_date」の型は DateTimeField です。ブログのタイムゾーンは「ヨーロッパ/アムステルダム」です。ブログ管理インターフェースに日付と時刻を入力すると、データベースの列に正しい値が表示されます (例: 2012 JUL 10 00:00 管理インターフェース => 2012 JUL 09 22:00 UTC PostgreSQL)。関数 Blog.get_absolute_url() は /2012/07/09/slug を生成します。私はUTCの日付を期待しています(私には問題ありません)
私のurls.pyはすべての例に似ています。
info_dict = {
'queryset': Blog.objects.all(),
'date_field': 'pub_date',
}
url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', 'django.views.generic.date_based.object_detail', info_dict),
(注: ここでは関数ベースのジェネリック ビューを使用していますが、クラス ベースのビューも試しました。両方のビューで同じ問題が発生します)。
問題は、すべてのブログ エントリは get_absolute_url() の値で見つけることができますが、ローカル タイム ゾーンと UTC の日付が異なるもの (例: 2012 JUL 10 00:00 ローカル => 2012 JUL 09 22:00) ではないことです。 UTC)。「404」が表示されます-runserverで実行すると、エラーはRuntimeWarning: DateTimeField received a naive datetime (2012-07-09 23:59:59.999999) while time zone support is activeです。
ネットで検索したところ、Django タイムゾーンの問題に関する多くの投稿が表示されました。それらのほとんどは、日付ベースのアーカイブの月形式に関連しています。ほとんどの修正を行うために、最新の Django リリース 1.4.1 を使用しています。タイムゾーンに関連する date_based.object_detail や DateDetailView のチュートリアルや書籍の例は見つかりませんでした。現時点では、正しい方法について疑問があります。
おそらく良い考えではない
- 「タイムゾーン」の認識 (USE_TZ = False) を失うことはできますが、それは問題を無視しています
- *get_absolute_url()* を変更して、ローカル タイム ゾーン (この例では 2012/07/10/slug) で日付を生成できますが、データベース形式とユーザー形式を混同しています。
これが良い(または実行可能な)アイデアかどうかわからない
- pub_date が UTC 形式であることをジェネリック ビューに通知するために、辞書 info_dict を操作します。私はそれを行う方法を見つけることができませんでした
- ディクショナリを使用して日時形式 (pub_date.date など) を変更しますが、これにより構文エラーが発生します。また、Django のドキュメントによると、DateField と DateTimeField はジェネリック ビューでサポートされています。
良い方法は何ですか?pub_date に注目して DateField に変換するか、ビューで作業して DateTimeField を受け入れるか、一般的なビューから自作のビューに切り替えるか、または何か他のことを行いますか?
この問題を解決するためにDjangoで最も一般的な方法は何ですか?