2010-09-01 6 views
14

Ich möchte global (über meine gesamte Website, Admin und Front-End) die Art und Weise anpassen, wie Daten und Zeit nach meinen Vorstellungen angezeigt werden, aber ich kann nicht herausfinden, was mit den Variablen DATE_FORMAT, DATETIME_FORMAT und TIME_FORMAT in den Einstellungen passiert .py.Django: Verwendung von DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT in settings.py?

In this question heißt es, dass die Einstellungen ignoriert werden. Die Frage ist jedoch über ein Jahr alt. In der Django-Dokumentation heißt es, dass sie verwendet werden können, wenn Sie USE_L10N = True und anscheinend something changed in Django 1.2 haben. Laut this könnte es jedoch einen Fehler geben.

Ich verwende derzeit Django 1.2 und wenn ich USE_L10N = True habe, ignoriert es einfach das Datum (Zeit) -Format in settings.py. Wenn ich USE_L10N = False habe, scheint es auch sie zu ignorieren.

Gibt es eine Möglichkeit, die Anzeige von Datum und Uhrzeit global anzupassen? Oder sollte ich meine eigene Datei mit benutzerdefinierten Formaten erstellen, wie Karen es in den Google Group-Posts der Django-Nutzer vorschlägt?

Antwort

6

Hatte dasselbe Problem, Lösung ist simple and documented. Jedes Mal, wenn Sie einen Termin machen, müssen Sie angeben, die Vorlage wollen es machen als Datum/Zeit/SHORT_DATE/Datumzeit (zB {{ some_date_var | date }} und dann wird es es machen wie angegeben mit DATE_FORMAT in Ihrem settings.py

Beispiel :

>>> 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. 

das macht Sinn, zum Beispiel, muss die Vorlage wissen, ob sie die DATE_FORMAT oder die SHORT_DATE_FORMAT oder was auch immer verwenden sollten

7

durch die Quelle der Suche zeigt, dass DATETIME_FORMAT usw. wird nur verwendet, wenn django.utils.formats.localize() genannt wird, und das scheint nur aufgerufen werden, wenn django.template.VariableNode s wiedergegeben werden.

Ich bin mir nicht sicher, wann genau VariableNode s in Vorlage Rendering verwendet werden, aber ich würde vermuten, dass, wenn Sie settings.USE_L10N eingeschaltet haben und Sie eine VariableNode haben, wird es lokalisiert werden.

localize sieht wie folgt aus:

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 

Ihre Frage zu beantworten, würde ich wahrscheinlich einen schnellen Kontext Prozessor schreiben, die localize() auf alles im Kontext genannt.

1

Sie DATE_FORMAT außer Kraft setzen können, DATETIME_FORMAT, TIME_FORMAT und andere. Datum/Uhrzeit-Formate, wenn USE_L10N = True von creating custom format files as described in Django documentation.

Zusammengefasst:

  1. FORMAT_MODULE_PATH = 'yourproject.formats' In settings.py
  2. Verzeichnisstruktur erstellen yourproject/formats/en (en mit dem entsprechenden ISO 639-1 locale Code zu ersetzen, wenn Sie andere locale als Englisch verwenden) und fügen Sie __init__.py Dateien alle Verzeichnisse, um es zu einem gültigen Python-Modul zu machen
  3. Fügen Sie formats.py dem Blattverzeichnis hinzu, das die Formatdefinitionen enthält, die Sie überschreiben möchten, z DATE_FORMAT = 'j. F Y'.

Beispiel aus einem aktuellen Projekt here.

1

Eine späte Antwort, aber hoffentlich hilft das jedem, der danach sucht. Wenn Sie in Ihren Einstellungen USE_L10N = True festlegen, sucht Django nach länderspezifischen Formaten und weist ihnen Vorrang vor nicht-länderspezifischen Einstellungen zu.

Die Lösung: (zum Anzeigen auf einem 30/12/2017 Datefield)

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

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

und für die Eingänge (akzeptieren oder 30/12/2017 30-12-2017)

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

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

* getestet auf Django == 1.10.7

+0

Ist es nicht einfacher, benutzerdefinierte Formatdateien zu erstellen, wie in https://docs.djangoproject.com/en/1.10/topics/i18n/formatting/#creating-custom-format-files beschrieben? – mrts