0

私はそれらのモデルを持っています:

class TimeZone(models.Model):
    name = models.CharField(max_length = 40, unique = True, editable = False)
    def tz(self):
        return pytz.timezone(str(self.name))

class Place(models.Model):
    name = models.CharField(max_length=200)
    timezone = models.ForeignKey(TimeZone)

class PlaceAction(models.Model):
    action_time = models.DateTimeField(blank=True, null=True)
    place = models.ForeignKey(Place, related_name='Stop place')

    def save(self, *args, **kwargs):
        place_tz = self.place.timezone.tz()
        if self.action_time:
            self.action_time = place_tz.localize(self.action_time)
        return super(PlaceAction, self).save(*args, **kwargs)

私のユーザーは場所と単純な日時をフォームに入力します。場所のタイムゾーンは既に DB にあるので、ユーザーからタイムゾーンを取得する必要はありません。この日時を DB の認識日時として変換して保存します (私は Postgres を使用します)。データは正しいオフセットで正しく保存されます。

データを (更新フォームなどで) レンダリングしたい場合、Django はデータを単純な日時に変換しますが、settings.py のデフォルトのタイムゾーン (TIME_ZONE = 'UTC') を使用します。正しいタイムゾーン (Place オブジェクトのタイムゾーン) を使用して、認識されている日時を単純な日時に戻す最良の方法を知りたいと思います。テンプレート レベルではなく、モデル レベルで変換を行います (日時の選択には JQueryUI を使用します。最初の変換はそこで行われるため、同じ場所で逆変換を行います)。

私のアイデアのいくつか: モデル PlaceAction init ()? カスタムマネージャーとは?

デフォルトのタイムゾーンとは異なるタイムゾーンへの逆変換のベスト プラクティスがドキュメントに見つかりませんでした。ありますか?

4

2 に答える 2

0

PlaceActionnaive に変換するメソッドを追加して、それをテンプレートで使用できます。

class PlaceAction(models.Model):
    action_time = models.DateTimeField(blank=True, null=True)
    place = models.ForeignKey(Place, related_name='Stop place')

    def naive_action_time (self):
        """action_time but without the timezone :-)

        """
        # Updated from Renaud Milon's comment
        return self.action_time.astimezone(place_tz).replace(tzinfo=None)

.

{% place_action.naive_action_time %}
于 2013-04-25T16:18:54.717 に答える