2009-09-20 25 views
11

django newbie aquí. Tengo un intento de una página de registro.django dateTimeWidget no aparece

Se compone de campos de texto (nombre, nombre de usuario, contraseña, etc.) y un DateField (cumpleaños).

estoy tratando de usar un widget para el forms.DateTimeInput DateField, pero cuando se vuelve a la página, no pasa nada. ¿Estoy haciendo algo mal? ¿Esto tiene algo que estoy pasando por alto? Parece bastante simple, pero no puedo hacer que funcione.

Esta es mi 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 

Y mi muy simple HTML

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

¿Podría aclarar? ¿No se procesa todo el formulario o solo el campo DateTime? – David

+0

Aparecen los formularios y las 'entradas'. Es el widget de calendario que no funciona. – Tom

+0

Cuando leí el widget DateInput, también esperaba un control de selector de fecha gráfica (como en django admin). Sin embargo, supongo que es solo un cuadro de texto sin formato. No es IMO intuitivo. – User

Respuesta

4

No use un DateTimeInput con un DateField - o bien utilizar un DateInput, o una DateTimeField.

Sin embargo, sospecho que lo que entendemos por 'no pasa nada' es que no aparecen los enlaces para el selector de fecha del calendario. Estos no son parte del marco de formularios estándar, y la documentación no sugiere que aparezcan con una Fecha/FechaTiempoInput. Son parte de la aplicación de administración, por lo que si los necesita en su propia aplicación deberá incluir los archivos javascript explícitamente.

La manera más fácil de hacer esto es probablemente usar AdminDateWidget en el django.contrib.admin.widgets, en lugar de DateInput. También deberá incluir el script jsi18n en su plantilla:

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

Estoy realmente confundido acerca de dónde está Django con los widgets de fecha y hora. Los documentos implican una actualización en 1.1 pero no estoy seguro de qué se trata. Si tengo un formulario como este:

 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) 
El javascript está cargado, pero no el icono de calendario aparece en el formulario. Me encantaría aclarar esto ya que tengo que volver a jQuery. – PhoebeB

+0

/admin/jsi18n needs isStaff – goh

6

El selector de fecha del calendario no forma parte de forms framework.
Sin embargo, puede usar jQuery widget de selector de fecha

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

Al hacer clic/seleccionar el cuadro de texto de cumpleaños, se mostrará un widget selector de calendario
Por favor, dar correcta ubicación de sus jquery.js y jquery-ui.js

10

El widget Django DateInput no representa nada más que una entrada de texto sin formato. Sin embargo, valida la entrada del usuario en una variedad de formatos, por lo que no es inútil.

La mayoría de la gente espera que se comporte de la misma manera que el selector de fechas que se encuentra en la interfaz de administración de Django, por lo que es sin duda un poco confuso.

Es posible utilizar el AdminDateWidget en sus propias aplicaciones, pero yo aconsejaría contra ella. Se necesita a lot of fiddling around to make it work.

La solución más fácil es utilizar algo así como el JQuery UI Datepicker.Sólo tiene que incluir lo siguiente en el <head> de su página:

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

A continuación, en la parte inferior, poner la siguiente línea para activar el selector de fechas en sus elementos de entrada:

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

Usted puede hacer esto un poco más DRY si tiene muchos campos de fecha mediante la creación de un widget personalizado en su 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",) 

Especificar cada campo de fecha se debe utilizar este widget en su f ORMS:

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

Y en su plantilla, incluyen lo siguiente en el <head>:

{{form.media}} 

y activar el selector de fechas para todos los campos, colocando lo siguiente en la parte inferior de la página:

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