2017-09-13 22 views
0

模型對象datetime屬性當地時間我想使它這樣一個模型對象的時間字段屬性顯示在模板當前用戶的時區的本地時間。我的設置中的默認時區是UTC。下面是一個例子模型:顯示了在Django

models.py

class Basic(models.Model): 
    name = models.CharField(max_length=128) 
    created_at = models.DateTimeField(auto_now_add=True 

我想顯示的數據是與Django的tables2製成的表。不過,我已經嘗試過兩種方法都和他們沒有工作:

tables.py嘗試1:

class ShipperDataFileDocumentTable(tables.Table): 
    created_at = tables.TemplateColumn(''' 
             {% load tz %} 
             {% localtime on %} 
              {{ record.created_at }} 
             {% endlocaltime %} 
             ''') 
    class Meta: 
     model = Basic 
     fields = ('name', 'created_at') 

tables.py嘗試2:

class ShipperDataFileDocumentTable(tables.Table): 
    created_at = tables.TemplateColumn(''' 
             {% load tz %} 
             {{ record.created_at|localtime }} 
             ''') 
    class Meta: 
     model = Basic 
     fields = ('name', 'created_at') 

這兩種方法結束並沒有改變時間。例如,我在美國東部時間下午12點做了一個對象。通常情況下,模板會以UTC顯示爲4:00 PM。然而,即使有這些編輯,但它仍然顯示的時間爲4:00 PM。我不確定我做錯了什麼。

編輯:有沒有一種方法來檢測用戶的當前時區?我已經嘗試過的Django易時區,但由於某種原因不能正常工作。

回答

0

的Django提供了一種handle this

  1. 啓用時區支持:

    在你的設置文件中設置UZE_TZ = True

  2. 然後實現選擇用戶時區的方式:

    An example with a form and a middleware。 但更簡單的(比顯式形式)解決方案IMO是detect it in js,然後把它放在用戶會話/ cookie中。 例如與moment.js:

    Session['tz'] = moment.tz.guess()

  3. 然後呈現在模板中localtime

或者,如果你不想處理它的服務器端和喜歡做客戶端做出的Django的template的時區設置爲iso 8601然後convert it in jsjQuery

大量的解決方案,但仍然是一個PITA ...

+0

你能否詳細說明js方法以及它如何與datetimefield attrs在模型對象中合併? –

+0

不在模型對象中,您可以不改變模型,使用iso8601格式創建具有格式化日期時間的模板,然後使用'getElelementById'獲取相應的元素並將其轉換(它們)。如果你的頁面中有很多日期時間,這不是最好的解決方案,但我覺得它讓人擔心。 –

+0

我更傾向於在js中檢測它的答案的第2步。 –

0

另一個回答不好疑問,需要我的幫助。使用JavaScript轉換時間將是一個有效的方法,但由於其複雜性,我會推薦一個類似於moment.js的庫。然而,比學習一個新的JS框架有一個更簡單的方法。 Django的tables2認爲要在格林尼治標準時間的日期時間對象,但你可以改爲告訴它使用本地的顯示。如果您閱讀python文檔,UZE_TZ = True對於生產級代碼來說是個不好的主意,因爲您的日期時間將作爲本地時間進行存儲,從而在不可能的時區之間進行同步。你想要的是一個DateTime對象這是時區意識到,這樣2018-03-07 08:34:32.212841-05。你的代碼created_at = models.DateTimeField(auto_now_add=True)創建這樣一個對象,所以第一步是正確完成的。第二步,在當地時間向用戶顯示時間。添加到您的模型(我硬編碼東方演示,如果你看過pytz文檔,還有一個本地化功能):

def localTimeCreated(self): return self.created_at.astimezone(pytz.timezone('US/Eastern')).strftime("%H:%M:%S %p")

現在我們需要排除老created_at和引用新方法。轉到您的餐桌類,添加此屬性,並更改Meta:

createdFormatted = tables.Column(accessor='localTimeCreated', verbose_name='Created') # verbose_name = column header 

class Meta: 
    model = Basic 
    fields = ('name', 'createdFormatted') 
    exclude = ('created_at') 
    sequence = ('createdFormatted', 'name') #default: extra columns at the end 
    attrs = {"class" : "table-striped table-bordered"} 
    empty_text = "User not found." 

最後2個屬性是不相關的,但對於專業外觀很好。