2009-09-20 17 views
11

newbie django qui. Ho un tentativo di una pagina di registrazione.django dateTimeWidget non viene visualizzato

Consiste di campi di testo (nome, nome utente, password, ecc.) E un campo Data (compleanno).

Sto cercando di utilizzare un widget forms.DateTimeInput per DateField, ma quando la pagina viene sottoposta a rendering, non accade nulla. Sto facendo qualcosa di sbagliato? Questo ha qualcosa da guardare? Sembra piuttosto semplice, ma non riesco a farlo funzionare.

Questa è la mia forma

class RegisterForm(forms.Form): 
    username = forms.CharField(max_length= 50) 
    password = forms.CharField(label=u'Password',widget = forms.PasswordInput(render_value=False))#password 

    birthday = forms.DateField(required=False,initial=datetime.date.today,widget = forms.DateTimeInput())#25 Oct 2006 

E la mia molto semplice HTML

<form action="" method = "POST"> 
{{ form.as_p}} 
<input type='Submit' value='Register'/> 
</form> 
+0

Potrebbe chiarire? L'intero modulo non viene visualizzato, o solo il campo DateTime? – David

+0

Vengono visualizzati i moduli e gli "input". È il widget del calendario che non lo fa. – Tom

+0

Quando ho letto il widget DateInput, mi sarei aspettato un controllo grafico per la selezione delle date (come nell'amministratore di django). Tuttavia, immagino sia solo una semplice casella di testo. IMO non intuitivo. – User

risposta

4

Si consiglia di non utilizzare un DateTimeInput con un DateField - utilizzare una DateInput, o un DateTimeField.

Tuttavia, sospetto che cosa intendi per "non succede nulla" è che i collegamenti per il selettore di date del calendario non vengono visualizzati. Questi non fanno parte del framework dei moduli standard e la documentazione non suggerisce che vengano visualizzati con Date/DateTimeInput. Fanno parte dell'applicazione di amministrazione, quindi se ne hai bisogno nella tua app dovrai includere esplicitamente i file javascript.

Il modo più semplice per farlo è probabilmente quello di utilizzare AdminDateWidget da django.contrib.admin.widgets, piuttosto che il dateinput. Sarà inoltre necessario includere lo script jsi18n nel modello:

<script type="text/javascript" src="/admin/jsi18n/"></script> 
+0

Sono davvero confuso su dove sia Django con i widget datetime. I documenti implicano un aggiornamento in 1.1 ma non sono chiaro di cosa si tratta. Se ho una forma come questa:

 class EventForm(forms.ModelForm): summary = forms.CharField(label="Event Name", widget=forms.TextInput(attrs={'size':'40'})) dtstart = forms.DateTimeField(widget=AdminDateWidget()) dtend = forms.DateTimeField(widget=AdminDateWidget) 
Il javascript è caricato, ma l'icona del calendario non appare nel modulo. Mi piacerebbe avere un po 'di chiarezza in questo senso mentre continuo a dover tornare a jQuery. – PhoebeB

+0

/admin/jsi18n richiede isStaff – goh

6

calendario selettore data non è parte integrante del quadro forme.
È possibile comunque utilizzare jQuery widget di selettore di data

<script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-min.js"></script> 
<!-- give correct location for jquery.js --> 
<script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-ui-min.js"></script> 
<!-- give correct location for jquery-ui.js --> 
<script type="text/javascript"> 
    jQuery(function() { 
     jQuery("#id_birthday").datepicker({ dateFormat: 'yy-mm-dd' }); 
    }); 
</script> 
<form method="post"> 
    {{ form.as_p }} 
    <input type="submit" value="Create Phase" /> 
</form> 

On cliccando/selezionando la casella di testo di compleanno, mostrerà un widget selettore di calendario
Si prega di dare una corretta posizione dei vostri jquery.js e jQuery-ui.js

10

Il widget Django DateInput non esegue alcun rendering se non un semplice inserimento di testo. Tuttavia, convalida l'input dell'utente su una varietà di formati, quindi non è inutile.

La maggior parte delle persone si aspetterebbe che si comportasse nello stesso modo del selettore di date trovato nell'interfaccia di Django Admin, quindi è sicuramente un po 'di confusione.

È possibile utilizzare AdminDateWidget nelle proprie app, ma vorrei sconsigliarlo. Ci vuole a lot of fiddling around to make it work.

La soluzione più semplice è utilizzare qualcosa come JQuery UI Datepicker.È sufficiente inserire il seguente nel <head> della pagina:

<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/redmond/jquery-ui.css" rel="Stylesheet" /> 
<script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script> 

Poi in fondo, mettere la seguente riga per attivare la Datepicker sui vostri elementi di input:

<script type="text/javascript"> 
    $(function(){ 
    $("#id_birthday").datepicker(); 
    }); 
</script> 

Si può fare di questo un po 'di più DRY se si dispone di molti campi data con la creazione di un widget personalizzato nel forms.py:

class JQueryUIDatepickerWidget(forms.DateInput): 
    def __init__(self, **kwargs): 
     super(forms.DateInput, self).__init__(attrs={"size":10, "class": "dateinput"}, **kwargs) 

    class Media: 
     css = {"all":("http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/redmond/jquery-ui.css",)} 
     js = ("http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js", 
       "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js",) 

Specificare ogni campo data dovrebbe usare questo widget nella vostra f ORM:

birthday = forms.DateField(label="Birthday", widget=JQueryUIDatepickerWidget) 

E nel tuo modello, includono quanto segue nel <head>:

{{form.media}} 

e attivare il Datepicker per tutti i campi mettendo quanto segue alla parte inferiore della pagina:

<script type="text/javascript"> 
    $(function(){ 
    $(".dateinput").datepicker(); 
    }); 
</script> 
Problemi correlati