2010-09-01 19 views
14

Me gustaría globalmente (a través de todo mi sitio, administrador y front-end) ajustar la forma en que las fechas y la hora se muestran a mis gustos, pero no puedo entender qué está sucediendo con las variables DATE_FORMAT, DATETIME_FORMAT y TIME_FORMAT en la configuración .py.Django: uso de DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT en settings.py?

En this question dice que las configuraciones se ignoran. La pregunta tiene más de un año. En la documentación de Django dice que se pueden usar cuando tienes USE_L10N = True y aparentemente something changed en Django 1.2. De acuerdo con this, sin embargo, puede haber un error.

Actualmente estoy usando Django 1.2 y cuando tengo USE_L10N = True simplemente ignora el formato de fecha (hora) en settings.py. Cuando tengo USE_L10N = False también parece ignorarlos.

¿Hay alguna forma de personalizar globalmente la visualización de la fecha y la hora? ¿O debería crear mi propio archivo de formatos personalizados como sugiere Karen en la publicación del Grupo de Google de usuarios de Django?

Respuesta

6

Tenía el mismo problema, la solución es simple and documented. Cada vez que se procesa una fecha, es necesario especificar que desea la plantilla para que sea como una fecha/hora/SHORT_DATE/fecha y hora (por ejemplo, {{ some_date_var | date }} y luego se las puede hacer como se especifica con DATE_FORMAT en su settings.py

Ejemplo :

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

Esto tiene sentido, por ejemplo, la plantilla tiene que saber si se debe utilizar el DATE_FORMAT o la SHORT_DATE_FORMAT o lo que sea

7

La búsqueda a través de la fuente muestra que DATETIME_FORMAT, etc., solo se usa cuando se llama a django.utils.formats.localize(), y que solo parece invocarse cuando se procesan django.template.VariableNode s.

No estoy seguro de que cuando se utilizan exactamente VariableNode s en representación de la plantilla, pero me imagino que si usted tiene settings.USE_L10N encendido y tiene una VariableNode, se localiza.

localize se parece a esto:

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 

Para responder a su pregunta, probablemente escribir un procesador de contexto rápida que llama localize() sobre todo en el contexto.

1

puede anular DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT y otra. formatos de fecha/hora cuando USE_L10N = True por creating custom format files as described in Django documentation.

En resumen:

  1. Establecer FORMAT_MODULE_PATH = 'yourproject.formats' en settings.py
  2. Crear la estructura de directorios yourproject/formats/en (reemplazando en con el código de configuración regional correspondiente ISO 639-1 si está utilizando otro local de Inglés) y añadir archivos a __init__.py todos los directorios para hacer que sea un módulo de Python válido
  3. Agregue formats.py al directorio de hojas, que contiene las definiciones de formato que desea sobrescribir, por ejemplo DATE_FORMAT = 'j. F Y'.

Ejemplo de un proyecto real here.

1

Una respuesta tardía, pero esperamos que esto ayude a cualquier otra persona a buscar esto. Al establecer USE_L10N = Verdadero en su configuración, Django busca formatos específicos de la configuración regional, otorgándoles prioridad sobre la configuración no relacionada con la configuración regional.

La solución: (para mostrar 30/12/2017 en un DateField)

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

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

y para las entradas (para aceptar 30/12/2017 o 30-12-2017)

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

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

* probado en Django == 1.10.7

+0

¿No es más fácil crear archivos de formato personalizado como se describe en https://docs.djangoproject.com/en/1.10/topics/i18n/formatting/#creating-custom-format-files? – mrts

Cuestiones relacionadas