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):
from django import forms
from my_app.models import Product
from django.contrib.admin import widgets
class ProductForm(forms.ModelForm):
class Meta:
model = Product
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
self.fields['mydate'].widget = widgets.AdminDateWidget()
self.fields['mytime'].widget = widgets.AdminTimeWidget()
self.fields['mydatetime'].widget = widgets.AdminSplitDateTime()
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á:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
También es posible que desee utilizar el siguiente administrador CSS (gracias Alex por mencionar esto):
<link rel="stylesheet" type="text/css" href="/media/admin/css/forms.css"/>
<link rel="stylesheet" type="text/css" href="/media/admin/css/base.css"/>
<link rel="stylesheet" type="text/css" href="/media/admin/css/global.css"/>
<link rel="stylesheet" type="text/css" href="/media/admin/css/widgets.css"/>
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:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
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:
{% load adminmedia %} /* At the top of the template. */
/* In the head section of the template. */
<script type="text/javascript">
window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
</script>
Gracias lupefiasco por esta adición.