Die zunehmende Komplexität dieser Antwort im Laufe der Zeit und die vielen erforderlichen Hacks sollten Sie wahrscheinlich davor warnen, dies überhaupt zu tun. Es basiert auf undokumentierten internen Implementierungsdetails des Administrators, wird in zukünftigen Versionen von Django wahrscheinlich wieder kaputt gehen und ist nicht einfacher zu implementieren, als nur ein anderes JS-Kalender-Widget zu finden und dieses zu verwenden.
Das heißt, hier ist, was Sie tun müssen, wenn Sie entschlossen sind, diese Arbeit zu machen:
Definieren Sie Ihre eigene ModelForm-Unterklasse für Ihr Modell (am besten in forms.py in Ihrer App) und weisen Sie es an, AdminDateWidget / AdminTimeWidget / AdminSplitDateTime zu verwenden (ersetzen Sie 'mydate' usw. durch die richtigen Feldnamen aus Ihrem Modell):
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()
Ändern Sie Ihre URLconf so, dass 'form_class': ProductForm anstelle von 'model': Product an die generische Ansicht create_object übergeben wird (dies bedeutet natürlich "from my_app.forms import ProductForm" anstelle von "from my_app.models import Product").
Fügen Sie im Kopf Ihrer Vorlage {{form.media}} ein, um die Links zu den Javascript-Dateien auszugeben.
Und der hackige Teil: Die Widgets für Datum und Uhrzeit des Administrators setzen voraus, dass das i18n JS-Zeug geladen wurde, und erfordern auch core.js, stellen jedoch keines automatisch bereit. In Ihrer Vorlage über {{form.media}} benötigen Sie also:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Möglicherweise möchten Sie auch das folgende Admin-CSS verwenden (danke Alex, dass Sie dies erwähnt haben):
<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"/>
Dies bedeutet, dass sich Djangos Administratormedien (ADMIN_MEDIA_PREFIX) unter / media / admin / befinden. Sie können dies für Ihr Setup ändern. Idealerweise verwenden Sie einen Kontextprozessor, um diese Werte an Ihre Vorlage zu übergeben, anstatt sie fest zu codieren. Dies würde jedoch den Rahmen dieser Frage sprengen.
Dies erfordert auch, dass die URL / my_admin / jsi18n / manuell mit der Ansicht django.views.i18n.javascript_catalog (oder null_javascript_catalog, wenn Sie I18N nicht verwenden) verbunden ist. Sie müssen dies selbst tun, anstatt die Administratoranwendung zu durchlaufen, damit Sie darauf zugreifen können, unabhängig davon, ob Sie beim Administrator angemeldet sind (danke Jeremy, dass Sie darauf hingewiesen haben). Beispielcode für Ihre URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Wenn Sie Django 1.2 oder höher verwenden, benötigen Sie zusätzlichen Code in Ihrer Vorlage, damit die Widgets ihre Medien finden können:
{% 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>
Danke lupefiasco für diesen Zusatz.