2010-09-01 99 views
14

我想全球(通過我的整個網站,管理員和前端)調整日期和時間的方式顯示給我的喜好,但我無法弄清楚在設置中的DATE_FORMAT,DATETIME_FORMAT和TIME_FORMAT變量是怎麼回事的.py。Django:在settings.py中使用DATE_FORMAT,DATETIME_FORMAT,TIME_FORMAT?

this question它說,設置被忽略。這個問題已經過了一年多了。在Django文檔中,它表示可以在Django 1.2中使用USE_L10N = True和顯然something changed時使用它們。根據this但是可能有一個錯誤。

我目前使用Django 1.2,當我有USE_L10N = True它只是忽略settings.py中的日期(時間)格式。當我有USE_L10N = False它似乎也忽略它們。

有沒有一種方法來全局自定義日期和時間顯示?還是應該按照Karen在Django用戶Google羣組中發佈的建議創建自己的自定義格式文件?

回答

6

有同樣的問題,解決方案是simple and documented。無論您何時渲染日期,都需要指定您希望模板將其渲染爲日期/時間/短日期/日期時間(例如,{{ some_date_var | date }},然後它將按照您的settings.py中的DATE_FORMAT指定的方式渲染它)。示例:

>>> from django.conf import settings # imported to show my variables in settings.py 
>>> settings.DATE_FORMAT # - showing my values; I modified this value 
'm/d/Y' 
>>> settings.TIME_FORMAT 
'P' 
>>> settings.DATETIME_FORMAT 
'N j, Y, P' 
>>> from django.template import Template, Context 
>>> from datetime import datetime 
>>> c = Context(dict(moon = datetime(1969, 7, 20, 20, 17, 39))) # Create context with datetime to render in a template 
>>> print c['moon'] # This is the default format of a printing datetime object 
1969-07-20 20:17:39 
>>> print Template("default formatting : {{ moon }}\n" 
        "use DATE_FORMAT : {{ moon|date }}\n" 
        "use TIME_FORMAT : {{ moon|time }}\n" 
        "use DATETIME_FORMAT: {{ moon|date:'DATETIME_FORMAT' }}\n" 
        "use SHORT_DATETIME_FORMAT: {{ moon|date:'SHORT_DATETIME_FORMAT' }}" 
        ).render(c) 
default formatting : 1969-07-20 20:17:39 
use DATE_FORMAT : 07/20/1969 
use TIME_FORMAT : 8:17 p.m. 
use DATETIME_FORMAT: July 20, 1969, 8:17 p.m. 
use SHORT_DATETIME_FORMAT: 07/20/1969 8:17 p.m. 

這是有道理的;例如,模板需要知道它是否應使用DATE_FORMATSHORT_DATE_FORMAT或任何

7

通過源搜索顯示僅在調用django.utils.formats.localize()時才使用DATETIME_FORMAT等,並且僅在呈現django.template.VariableNode時似乎纔會調用。

我不確定在模板渲染中的確切位置,但我猜如果你有settings.USE_L10N開啓,並且你有VariableNode,它將會被本地化。

localize看起來是這樣的:

def localize(value): 
    """ 
    Checks if value is a localizable type (date, number...) and returns it 
    formatted as a string using current locale format 
    """ 
    if settings.USE_L10N: 
     if isinstance(value, (decimal.Decimal, float, int)): 
      return number_format(value) 
     elif isinstance(value, datetime.datetime): 
      return date_format(value, 'DATETIME_FORMAT') 
     elif isinstance(value, datetime.date): 
      return date_format(value) 
     elif isinstance(value, datetime.time): 
      return time_format(value, 'TIME_FORMAT') 
    return value 

要回答你的問題,我可能會寫一個快速的背景處理器上的來龍去脈稱爲localize()

1

您可以覆蓋DATE_FORMATDATETIME_FORMATTIME_FORMAT等。日期/時間格式USE_L10N = Truecreating custom format files as described in Django documentation

總結:

  1. settings.py
  2. 設置FORMAT_MODULE_PATH = 'yourproject.formats'創建目錄結構yourproject/formats/en(與相應的ISO 639-1地區代碼替換en如果你使用的是其他區域設置非英語),並添加__init__.py文件使所有目錄成爲有效的Python模塊
  3. formats.py添加到葉目錄,其中包含要覆蓋的格式定義,例如DATE_FORMAT = 'j. F Y'

來自實際項目的示例here

1

遲到的反應,但希望這會幫助其他人尋找這個。 通過在您的設置中設置USE_L10N = True,Django查找特定於語言環境的格式,使其優先於非語言環境相關設置。

解決辦法:(對將DateField顯示30/12/2017)

from django.conf.locale.en import formats as en_formats 

en_formats.DATE_FORMAT = "%d/%m/%Y" 

和用於輸入(接受30/12/2017或30-12-2017)

en_formats.DATE_INPUT_FORMATS = ['%d/%m/%Y', '%d-%m-%Y'] 

參考:https://mounirmesselmeni.github.io/2014/11/06/date-format-in-django-admin/

*上的Django ==測試1.10.7

+0

如https://docs.djangoproject.com/en/1.10/topics/i18n/formatting/#creating-custom-format-files中所述創建自定義格式文件不是更容易嗎? – mrts 2017-12-23 20:42:22