Rosnąca złożoność tej odpowiedzi z biegiem czasu i wiele wymaganych hacków prawdopodobnie powinno Cię przestrzec przed zrobieniem tego w ogóle. Opiera się na nieudokumentowanych wewnętrznych szczegółach implementacji administratora, prawdopodobnie ponownie się zepsuje w przyszłych wersjach Django i nie jest łatwiejszy do wdrożenia niż po prostu znalezienie innego widżetu kalendarza JS i użycie go.
To powiedziawszy, oto co musisz zrobić, jeśli jesteś zdeterminowany, aby to zadziałało:
Zdefiniuj własną podklasę ModelForm dla swojego modelu (najlepiej umieścić ją w forms.py w swojej aplikacji) i powiedz mu, aby używał AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (zastąp „mydate” itp. Odpowiednimi nazwami pól z Twojego modelu):
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()
Zmień adres URLconf, aby przekazywał „form_class”: ProductForm zamiast „model”: Product do ogólnego widoku create_object (co oczywiście będzie oznaczać „from my_app.forms import ProductForm” zamiast „from my_app.models import Product”, oczywiście).
W nagłówku szablonu umieść {{form.media}}, aby wyświetlić linki do plików Javascript.
I zepsuta część: widżety daty / czasu administratora zakładają, że elementy JS i18n zostały załadowane, a także wymagają core.js, ale nie dostarczają żadnego z nich automatycznie. Więc w swoim szablonie powyżej {{form.media}} będziesz potrzebować:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Możesz także chcieć użyć następującego CSS administratora (dzięki Alex za wspomnienie o tym):
<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"/>
Oznacza to, że nośnik administratora Django (ADMIN_MEDIA_PREFIX) znajduje się w / media / admin / - możesz to zmienić dla swojej konfiguracji. Idealnie byłoby użyć procesora kontekstu do przekazania tych wartości do szablonu zamiast zakodowania go na sztywno, ale to wykracza poza zakres tego pytania.
Wymaga to również, aby adres URL / my_admin / jsi18n / był ręcznie połączony z widokiem django.views.i18n.javascript_catalog (lub null_javascript_catalog, jeśli nie używasz I18N). Musisz to zrobić samodzielnie, zamiast przechodzić przez aplikację administratora, aby była dostępna niezależnie od tego, czy jesteś zalogowany jako administrator (dzięki Jeremy za wskazanie tego). Przykładowy kod dla twojego URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Na koniec, jeśli używasz Django 1.2 lub nowszego, potrzebujesz dodatkowego kodu w swoim szablonie, aby pomóc widżetom znaleźć ich multimedia:
{% 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>
Dzięki lupefiasco za ten dodatek.