2

私のブログは 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 のチュートリアルや書籍の例は見つかりませんでした。現時点では、正しい方法について疑問があります。

おそらく良い考えではない

  1. 「タイムゾーン」の認識 (USE_TZ = False) を失うことはできますが、それは問題を無視しています
  2. *get_absolute_url()* を変更して、ローカル タイム ゾーン (この例では 2012/07/10/slug) で日付を生成できますが、データベース形式とユーザー形式を混同しています。

これが良い(または実行可能な)アイデアかどうかわからない

  1. pub_date が UTC 形式であることをジェネリック ビューに通知するために、辞書 info_dict を操作します。私はそれを行う方法を見つけることができませんでした
  2. ディクショナリを使用して日時形式 (pub_date.date など) を変更しますが、これにより構文エラーが発生します。また、Django のドキュメントによると、DateField と DateTimeField はジェネリック ビューでサポートされています。

良い方法は何ですか?pub_date に注目して DateField に変換するか、ビューで作業して DateTimeField を受け入れるか、一般的なビューから自作のビューに切り替えるか、または何か他のことを行いますか?

この問題を解決するためにDjangoで最も一般的な方法は何ですか?

4

2 に答える 2

3

私は今、この正確な問題に数時間取り組んできました。重要なのは、私の get_absolute_url ロジックの結果が UTC 応答になることですが、DateDetailView は URL がローカル タイムゾーンと一致することを期待しています。

これに対する私の解決策は、get_absolute_url の次のとおりです。

from django.utils import timezone

class MyModel(models.Model):
# Other model code here

def _get_absolute_url(self):
    local_pub_date = timezone.localtime(self.entry.pub_date)
    return ('%sblog_detail', (), {
        'year': local_pub_date.year,
        'month': local_pub_date.strftime('%m'),
        'day': local_pub_date.strftime('%d'),=
        'slug': self.slug
    })
get_absolute_url = models.permalink(_get_absolute_url)

これは私の目的のために働くようです。ただし、すべてのユーザーが同じタイムゾーンにいるため、より多様なユーザーベースを持つサイトには適していない可能性があります.

-PT

于 2013-01-07T20:23:31.727 に答える
0

get_absolute_urlが代わりに次の日付を表示するという同じ問題があります。私はどこでも検索しましたが、最新のDjangoバージョンに役立つものは何も見つかりません。あなたへの私の唯一の提案は、日付と時刻をデータベースの別々のフィールドにすることです。

于 2012-09-15T17:55:36.280 に答える