A crescente complexidade dessa resposta ao longo do tempo, e os muitos hacks necessários, provavelmente devem alertá-lo contra isso. Ele conta com detalhes de implementação interna não documentada do administrador, provavelmente quebrará novamente em versões futuras do Django, e não é mais fácil de implementar do que apenas encontrar outro widget de calendário JS e usá-lo.
Dito isto, eis o que você deve fazer se estiver determinado a fazer isso funcionar:
Defina sua própria subclasse ModelForm para o seu modelo (melhor para colocá-lo em forms.py no seu aplicativo) e diga-lhe para usar o AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (substitua 'mydate' etc. pelos nomes de campo adequados do seu 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()
Altere seu URLconf para passar 'form_class': ProductForm em vez de 'model': Product para a visualização create_object genérica (que significa "de my_app.forms import ProductForm" em vez de "de my_app.models import Product", é claro).
Na cabeça do seu modelo, inclua {{form.media}} para gerar os links para os arquivos Javascript.
E a parte hacky: os widgets de data / hora do administrador presumem que o material do i18n JS foi carregado e também exigem o core.js, mas não fornecem nenhum dos dois automaticamente. Portanto, no seu modelo acima {{form.media}}, você precisará:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Você também pode usar o seguinte CSS de administrador (obrigado Alex por mencionar isso):
<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"/>
Isso implica que a mídia administrativa do Django (ADMIN_MEDIA_PREFIX) está em / media / admin / - você pode mudar isso para sua configuração. Idealmente, você usaria um processador de contexto para transmitir esses valores ao seu modelo em vez de codificá-lo, mas isso está além do escopo desta pergunta.
Isso também requer que a URL / my_admin / jsi18n / seja conectada manualmente à visualização django.views.i18n.javascript_catalog (ou null_javascript_catalog se você não estiver usando I18N). Você precisa fazer isso sozinho, em vez de acessar o aplicativo de administração, para que fique acessível, independentemente de estar conectado ao administrador (obrigado Jeremy por apontar isso). Código de exemplo para o seu URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Por fim, se você estiver usando o Django 1.2 ou posterior, precisará de algum código adicional no seu modelo para ajudar os widgets a encontrar sua mídia:
{% 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>
Obrigado lupefiasco por esta adição.