¿Cómo puedo usar los ingeniosos widgets de fecha y hora de JavaScript que el administrador predeterminado usa con mi vista personalizada?
He revisado la documentación de formularios de Django , y menciona brevemente django.contrib.admin.widgets, pero no sé cómo usarla.
Aquí está mi plantilla en la que quiero que se aplique.
<form action="." method="POST">
<table>
{% for f in form %}
<tr> <td> {{ f.name }}</td> <td>{{ f }}</td> </tr>
{% endfor %}
</table>
<input type="submit" name="submit" value="Add Product">
</form>
Además, creo que debe tenerse en cuenta que realmente no he escrito una vista para este formulario, estoy usando una vista genérica. Aquí está la entrada de url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
Y soy significativamente nuevo en todo lo relacionado con Django / MVC / MTV, así que por favor, ve con calma ...
Respuestas:
La creciente complejidad de esta respuesta a lo largo del tiempo, y los muchos hacks requeridos, probablemente deberían advertirle de no hacerlo. Se basa en detalles de implementación internos no documentados del administrador, es probable que se rompa nuevamente en futuras versiones de Django, y no es más fácil de implementar que simplemente encontrar otro widget de calendario JS y usarlo.
Dicho esto, esto es lo que tienes que hacer si estás decidido a hacer que esto funcione:
Defina su propia subclase ModelForm para su modelo (lo mejor es ponerlo en forms.py en su aplicación) y dígale que use AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (reemplace 'mydate', etc. con los nombres de campo adecuados de su modelo):
Cambie su URLconf para pasar 'form_class': ProductForm en lugar de 'model': Producto a la vista genérica create_object (eso significará "from my_app.forms import ProductForm" en lugar de "from my_app.models import Product", por supuesto).
En el encabezado de su plantilla, incluya {{form.media}} para generar los enlaces a los archivos Javascript.
Y la parte hacky: los widgets de fecha / hora de administración suponen que el material i18n JS se ha cargado, y también requieren core.js, pero no proporcionan ninguno automáticamente. Por lo tanto, en su plantilla anterior {{form.media}} necesitará:
También es posible que desee utilizar el siguiente administrador CSS (gracias Alex por mencionar esto):
Esto implica que los medios de administración de Django (ADMIN_MEDIA_PREFIX) están en / media / admin / - puede cambiar eso para su configuración. Lo ideal sería usar un procesador de contexto para pasar estos valores a su plantilla en lugar de codificarla, pero eso está fuera del alcance de esta pregunta.
Esto también requiere que la URL / my_admin / jsi18n / se conecte manualmente a la vista django.views.i18n.javascript_catalog (o null_javascript_catalog si no está usando I18N). Debe hacerlo usted mismo en lugar de pasar por la aplicación de administración para que sea accesible independientemente de si ha iniciado sesión en el administrador (gracias Jeremy por señalar esto). Código de muestra para su URLconf:
Por último, si está utilizando Django 1.2 o posterior, necesita un código adicional en su plantilla para ayudar a los widgets a encontrar sus medios:
Gracias lupefiasco por esta adición.
fuente
Como la solución es complicada, creo que usar su propio widget de fecha / hora con algo de JavaScript es más factible.
fuente
Sí, terminé anulando / admin / jsi18n / url.
Esto es lo que agregué en mi urls.py. Asegúrate de que esté encima de / admin / url
Y aquí está la función i18n_javascript que creé.
fuente
Me encuentro haciendo referencia a esta publicación mucho, y descubrí que la documentación define un poco menos hacky de anular los widgets predeterminados.
( No es necesario anular el método __init__ de ModelForm )
Sin embargo, aún necesita conectar su JS y CSS adecuadamente como Carl menciona.
formas.py
Tipos de campos de referencia para buscar los campos de formulario predeterminados.
fuente
Mi código principal para la versión 1.4 (algunas nuevas y otras eliminadas)
fuente
A partir de Django 1.2 RC1, si está utilizando el truco del widget de selector de fecha de administración de Django, se debe agregar lo siguiente a su plantilla, o verá que la URL del ícono del calendario se hace referencia a través de "/ missing-admin-media-prefix / ".
fuente
Complementando la respuesta de Carl Meyer, me gustaría comentar que necesita poner ese encabezado en algún bloque válido (dentro del encabezado) dentro de su plantilla.
fuente
Para Django> = 2.0
Paso 1: Agregue
javascript-catalog
URL alurls.py
archivo de su proyecto (no de la aplicación) .Paso 2: Agregue los recursos JavaScript / CSS necesarios a su plantilla.
Paso 3: use widgets de administrador para los campos de entrada de fecha y hora en su
forms.py
.fuente
Lo siguiente también funcionará como último recurso si falla lo anterior
Igual que
pon esto en tus formularios.py
from django.forms.extras.widgets import SelectDateWidget
fuente
¿Qué pasa con solo asignar una clase a su widget y luego vincular esa clase al selector de fechas JQuery?
Django forms.py:
Y algunos JavaScript para la plantilla:
fuente
Solución actualizada y solución alternativa para SplitDateTime con required = False :
formas.py
form.html
urls.py
fuente
Lo uso, es genial, pero tengo 2 problemas con la plantilla:
Y para TimeField tengo ' Ingrese una fecha válida. '
modelos.py
formas.py
fuente
En Django 10. myproject / urls.py: al comienzo de urlpatterns
En mi template.html:
fuente
Mi configuración de Django: 1.11 Bootstrap: 3.3.7
Como ninguna de las respuestas es completamente clara, comparto mi código de plantilla que no presenta ningún error.
Mitad superior de la plantilla:
Mitad inferior:
fuente
3 de junio de 2020 (Todas las respuestas no funcionaron, puedes probar esta solución que utilicé. Solo para TimeField)
Use
Charfield
campos simples para tiempo ( inicio y fin en este ejemplo) en formularios.formas.py
podemos usar
Form
oModelForm
aquí.Convierta la entrada de cadena en objeto de tiempo en las vistas.
fuente