La complexité croissante de cette réponse au fil du temps et les nombreux hacks requis devraient probablement vous mettre en garde contre le fait de faire cela. Il repose sur des détails d'implémentation internes non documentés de l'administrateur, risque de se rompre à nouveau dans les futures versions de Django, et n'est pas plus facile à implémenter que de simplement trouver un autre widget de calendrier JS et de l'utiliser.
Cela dit, voici ce que vous devez faire si vous êtes déterminé à faire en sorte que cela fonctionne:
Définissez votre propre sous-classe ModelForm pour votre modèle (il est préférable de la mettre dans forms.py dans votre application) et dites-lui d'utiliser AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (remplacez 'mydate', etc. par les noms de champ appropriés de votre modèle):
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()
Modifiez votre URLconf pour passer 'form_class': ProductForm au lieu de 'model': Product à la vue générique create_object (cela signifiera "from my_app.forms import ProductForm" au lieu de "from my_app.models import Product", bien sûr).
Dans la tête de votre modèle, incluez {{form.media}} pour afficher les liens vers les fichiers Javascript.
Et la partie hacky: les widgets de date / heure d'administration supposent que le contenu de l'i18n JS a été chargé, et nécessitent également core.js, mais ne fournissent ni l'un ni l'autre automatiquement. Donc, dans votre modèle ci-dessus {{form.media}}, vous aurez besoin de:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Vous pouvez également utiliser le CSS d'administration suivant (merci Alex d' avoir mentionné cela):
<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"/>
Cela implique que le support d'administration de Django (ADMIN_MEDIA_PREFIX) se trouve dans / media / admin / - vous pouvez changer cela pour votre configuration. Idéalement, vous utiliseriez un processeur de contexte pour transmettre ces valeurs à votre modèle au lieu de le coder en dur, mais cela dépasse le cadre de cette question.
Cela nécessite également que l'URL / my_admin / jsi18n / soit câblée manuellement à la vue django.views.i18n.javascript_catalog (ou null_javascript_catalog si vous n'utilisez pas I18N). Vous devez le faire vous-même au lieu de passer par l'application d'administration afin qu'elle soit accessible, que vous soyez connecté ou non à l'administrateur (merci Jeremy de l' avoir signalé). Exemple de code pour votre URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Enfin, si vous utilisez Django 1.2 ou une version ultérieure, vous avez besoin d'un code supplémentaire dans votre modèle pour aider les widgets à trouver leur 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>
Merci lupefiasco pour cet ajout.