2013-04-25 38 views
0

我有那些機型:Django和時區:如何渲染知道日期時間爲一個天真的一個模板(與pytz)

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()? 使用自定義管理器?

我無法找到文檔中用於反向轉換爲與默認時區不同的時區的最佳做法。有一個嗎?

回答

0

您可以將方法添加到PlaceAction,該方法將轉換爲天真,然後在您的模板中使用該方法。

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 %} 
+0

顯然,在開發中有一個queryset方法。 [這裏](https://docs.djangoproject.com/en/dev/ref/models/querysets/#datetimes) – 2013-04-26 12:47:27

+0

爲了在原來的時區獲得正確的時間:'self.action_time.astimezone(place_tz).replace (tzinfo = None)' – 2013-04-26 12:58:06

+0

啊,當然,'astimezone'應該覆蓋掉DLS。除此之外,你可能會對你的時區字段感興趣https://github.com/mfogel/django-timezone-field。它針對ptyz進行驗證,並返回一個ptyz.Timezone()對象。 – rockingskier 2013-04-26 14:11:39

0

天真的日期時間是不知道時區的日期時間。要將時區知曉的日期時間視爲天真,您只需不顯示時區。

「我想知道到知道日期時間 轉換回天真的最佳途徑之一,使用正確的時區」

那句話根本就沒有任何意義。天真的日期,沒有正確的時區。我懷疑你想要的是將日期轉換爲數據庫給出的UTC日期時間的特定時區。

正確的位置是在視圖中。在任何時候都要在內部保持UTC狀態,並且只能轉換爲顯示。這是簡單的方法。

+0

是的,但是如何將它轉換爲顯示? – Bobort 2016-11-07 22:57:26

+0

datetime.strftime()通常。 – 2016-11-08 17:45:04

相關問題