2009-05-25 14 views
6

Django tiene las opciones DATE_FORMAT y DATE_TIME_FORMAT que nos permiten elegir qué formato usar al visualizar las fechas, pero aparentemente no me permite cambiar el formato de entrada para la fecha de edición o adición en el Django Admin.Entrada de fecha europea en Django Admin

El valor por defecto para el administrador es: AAAA-MM-DD

Pero sería impresionante de usar: DD-MM-AAAA

Es esta integrado en cualquier caso en el i18n? ¿Se puede cambiar esto sin un modelo personalizado?

Respuesta

2

Sobre la base de esta idea me hizo nueva clase EuDateField db.fields:

mydbfields.py

from django import forms 
from django.forms.fields import DEFAULT_DATE_INPUT_FORMATS 
from django.db import models 

class EuDateFormField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
     kwargs.update({'input_formats': ("%d.%m.%Y",)+DEFAULT_DATE_INPUT_FORMATS}) 
     super(EuDateFormField, self).__init__(*args, **kwargs) 

class EuDateField(models.DateField): 
    def formfield(self, **kwargs): 
     kwargs.update({'form_class': EuDateFormField}) 
     return super(EuDateField, self).formfield(**kwargs) 

nota que se añade a mi formato (por ejemplo, 31.12.2007) a los formatos existentes de Django "estándar" en primer lugar.

Uso:

from mydbfields import EuDateField 
class Person(models.Model): 
    ... 
    birthday = EuDateField("Birthday", null=True, blank=True, help_text="") 

En mi caso esto hace bien en admin, pero lo más probable será en ModelForm también (no he probado).

Mi versión de Django es:

>>> import django 
>>> django.get_version() 
u'1.1 alpha 1 SVN-10105' 
+0

Ok, esta solución es buena, pero ¿cómo puedo usarla con AdminDateWidget? Este widget es parte de mi MultiWidget. – alekwisnia

1

Parece que es not yet supported, según tengo entendido, así que sí, tendrá que hacer un trabajo personalizado por el momento.

2

Tiene que hacer esto usted mismo por el momento, pero es bastante fácil de hacer con una clase de campo de formulario personalizada que establece el argumento input_formats de DateField. Esto debe hacerlo:

class MyDateField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
    kwargs.setdefault('input_formats', ("%d-%m-%Y",)) 
    super(MyDateField, self).__init__(*args, **kwargs) 

Tenga en cuenta que input_formats es una lista, por lo que puede especificar múltiples posibilidades y tratará en orden al analizar la entrada del usuario.

+0

Puedo aplicar esto en mis nuevos formularios, pero, ¿cómo puedo anular el campo de formulario predeterminado en el sitio de administración? – Andor

2

He modificado la configuración de modo que desactiva l10n y establecer explicite formato de fecha:

USE_L10N = False 
DATE_FORMAT = 'd-m-Y' 
DATETIME_FORMAT = 'd-m-Y H:i' 

Puede establecer DATE_INPUT_FORMATS también.

9

Hay una manera oficial de hacer esto ahora desde el cierre de Django ticket 6483 & lanzamiento de Django 1.2.

Si tiene USE_L10N conjunto de False, lo que debe hacer es especificar el DATE_INPUT_FORMATS y DATETIME_INPUT_FORMATS en su settings.py. Éstos son los ajustes que utilizo para esto, a partir de la conversión de los valores por defecto:

#dd/mm/yyyy and dd/mm/yy date & datetime input field settings 
DATE_INPUT_FORMATS = ('%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', '%d %b %Y', 
         '%d %b, %Y', '%d %b %Y', '%d %b, %Y', '%d %B, %Y', 
         '%d %B %Y') 
DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S', '%d/%m/%Y %H:%M', '%d/%m/%Y', 
          '%d/%m/%y %H:%M:%S', '%d/%m/%y %H:%M', '%d/%m/%y', 
          '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d') 

Si tiene USE_L10N conjunto de True, entonces usted tendrá que utilizar el FORMAT_MODULE_PATH lugar.

Por ejemplo, mi LANGUAGE_CODE se establece en en-au, mi sitio se llama golf, y mi FORMAT_MODULE_PATH se establece en golf.formats, por lo que mi estructura de directorios es el siguiente:

golf/ 
    settings.py 
    ... 
    formats/ 
     __init__.py 
     en/ 
      __init__.py 
      formats.py 

y la configuración DATE_INPUT_FORMATS y DATETIME_INPUT_FORMATS son en formats.py en lugar de settings.py.

+1

Trabajó un placer para mí. ¡Gracias! –

0

solo tenga cuidado de no escribirlo como una cadena sino como una tupla. por ejemplo:

DATE_INPUT_FORMATS = ('%d.%m.%Y',) 

si usted quiere tener sólo una forma válida de la fecha de la escritura en una forma.