2009-05-25 12 views
6

Django ha le opzioni DATE_FORMAT e DATE_TIME_FORMAT che ci permettono di scegliere quale formato utilizzare quando si visualizzano le date, ma a quanto pare non mi permette di cambiare il formato di input per la data quando si modifica o si aggiunge nel Admin di Django.Inserimento data europeo in Django Admin

L'impostazione predefinita per l'amministratore è: YYYY-MM-DD

Ma sarebbe fantastico da usare: GG-MM-AAAA

È questo integrato in ogni caso in i18n? Può essere modificato senza un modello personalizzato?

risposta

2

Sulla base di questa idea ho fatto nuove db.fields classe EuDateField:

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 che aggiunge il mio formato (ad esempio, 31.12.2007) per i formati Django "standard" esistenti al primo posto.

Usage:

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

Nel mio caso questo rende bene in amministrazione, ma molto probabilmente sarà in ModelForm troppo (non hanno provato).

La mia versione è django:

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

Ok, questa soluzione è carina, ma come posso usarla con AdminDateWidget? Questo Widget fa parte del mio MultiWidget. – alekwisnia

1

Sembra che questo sia not yet supported, a quanto ho capito, quindi sì, per ora dovrai fare del lavoro personalizzato.

2

Si deve fare questo per ora, ma è abbastanza facile da fare con una classe campo modulo personalizzato che imposta l'argomento input_formats di DateField. Questo dovrebbe farlo:

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

Nota che input_formats è una lista, in modo da poter specificare più possibilità e sarà provarli al fine quando analizza l'input dell'utente.

+0

Posso applicare questo sui miei nuovi moduli, ma, come posso sovrascrivere il campo modulo predefinito nel sito di amministrazione? – Andor

2

Ho modificato le impostazioni in modo che disabilita l10n e impostare il formato della data esplicita:

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

È possibile impostare DATE_INPUT_FORMATS pure.

9

C'è un modo ufficiale per farlo ora dalla chiusura di Django ticket 6483 & versione di Django 1.2.

Se avete USE_L10N insieme a False, cosa si dovrebbe fare è specificare l'DATE_INPUT_FORMATS e DATETIME_INPUT_FORMATS nel vostro settings.py. Qui ci sono le impostazioni che uso per questo, in base convertendo i valori di default:

#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') 

Se avete USE_L10N insieme a True, allora si avrà bisogno di utilizzare il FORMAT_MODULE_PATH invece.

Ad esempio, il mio LANGUAGE_CODE è impostato su en-au, il mio sito si chiama golf, e la mia FORMAT_MODULE_PATH è impostato su golf.formats, quindi la mia struttura di directory simile a questo:

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

e le impostazioni DATE_INPUT_FORMATS e DATETIME_INPUT_FORMATS sono in formats.py anziché settings.py.

+1

ha funzionato per me. Grazie! –

0

solo fare attenzione a non scriverlo come stringa ma come una tupla. esempio:

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

se si vuole avere un solo modo valido di data di scrittura in una forma.