2013-10-09 8 views
5

Per qualche motivo, utilizzo un codice HTML personalizzato per la visualizzazione del modulo. L'input del mio modulo ottiene il valore iniziale (data) e mostra lo stesso modulo dopo l'invio.Valori datetime nei moduli Django (iniziale e inviato ha un formato diverso pensato)

Ma dopo l'invio, l'immissione non ha alcun valore precedentemente selezionato (solo vuoto).

Io uso {{ Form.Fileld.value|date:"Y-m-d" }} nel temlate per ottenere i valori iniziali e inviati.

Sembra che i valori iniziali e inviati siano in diversi formati: "datetime" per i valori iniziali e "string" dopo l'invio.

Qui è la mia semplice test:

Modulo

class ShowStartEndDateForm(forms.Form): 
    start_date = forms.DateField(initial=date.today().replace(day=1), 
     label="Start", 
     widget=forms.DateInput(format='%Y-%m-%d'), 
     input_formats=['%Y-%m-%d']) 
    ... 

View

if request.method == 'POST': 
    form_date = ShowStartEndDateForm(request.POST) 

    if form_date.is_valid(): 
     form_was_submitted = True 
     cd = form_date.cleaned_data 
     operator = cd['operators'] 

     days=[] 
     for day in range(0,(cd['end_date']-cd['start_date']).days+1): 
      days.append(cd['start_date']+relativedelta(days=+day)) 

else: 
    form_date = ShowStartEndDateForm() 

return render_to_response('epay.html', locals(), 
    context_instance=RequestContext(request)) 

Template

<!- HTML FORM here 
|classname is my custom template filter. 
--> 
Date1: {{ form_date.start_date.value|date:"Y-m-d" }} \ 
({{ form_date.start_date.value|classname }}) 
Date2: {{ form_date.start_date.value }} 

Prima convocazione in del browser:

Date1: 2013-10-01 (date) 
Date2: 1 October 2013 

Dopo modulo di conferma:

Date1: (unicode) 
Date2: 2013-10-01 

Che cosa sto facendo di sbagliato? Qual è il modo corretto per accedere ai valori iniziali e inviati del modulo?

Thnak you.

+0

è possibile mostrare la vista ? –

+0

Visualizza aggiornato. Tnx! – Lufa

risposta

5

La tua domanda è un po 'confusa (dovresti aggiungere un po' del tuo codice attuale), ma so per esperienza che quando si mischiano i formati, è una buona convenzione per fare tutto in un unico posto. Quindi, invece di specificare il formato sul lato client come fai tu, specifica tutto sul modulo stesso e poi tutto dovrebbe (dovrebbe) essere in-sync.

class ShowStartEndDateForm(forms.Form): 
    start_date = forms.DateField(initial=date.today().replace(day=1), 
           label="Start", 
           widget=DateInput(format='%Y-%m-%d'), 
           input_formats=['%Y-%m-%d']) 

cioè vi dico la il widget dateinput quale forma da prendere e si dicono input_formats (per il campo stesso) quali formati aspettarsi (è possibile aggiungere più di una). Inoltre, se stai usando una sorta di Datepicker, devi ovviamente assicurarti che stia usando il formato giusto.

Modifica

ho replicato questo e tutto andava bene:

In [1]: from test.forms import * 

In [2]: f = ShowStartEndDateForm() 

In [3]: print f 
<tr> 
    <th><label for="id_start_date">Start:</label></th> 
    <td><input id="id_start_date" name="start_date" type="text" value="2013-10-01" /></td> 
</tr> 

(ovviamente ho cambiato il rientro qui così si poteva vedere più chiaramente)

+0

Ancora nessuna fortuna. Ho aggiornato il codice sopra. Ancora, "form_date.start_date.value" iniziale consistono in "1 ottobre 2013" - valore DateTime, non stringa. i risultati dei test non sono cambiati. – Lufa

+0

ha aggiornato la mia risposta. Come puoi vedere, ho replicato con successo e non ho avuto problemi.Probabilmente c'è qualcos'altro che sta succedendo qui (forse stai usando un datepicker che cambia la presentazione del valore predefinito? Non posso proprio dirlo) – yuvi

+0

Grazie @yuvi. Solo due osservazioni: 1) Non utilizzo il widget standard, ma "Form.Fileld.value" non elaborato. 2) Il valore iniziale va bene quando si utilizza il tag del modello "| date" ". Ma dopo che il modulo ha inviato il tag "| date" "" non può analizzare correttamente il valore perché "Form.Fileld.value" non è più un oggetto DateTime ma una stringa "2013-10-01". – Lufa

Problemi correlati