La crescente complessità di questa risposta nel tempo e i numerosi hack richiesti, probabilmente dovrebbero metterti in guardia dal farlo. Si basa su dettagli dell'implementazione interna privi di documenti dell'amministratore, è probabile che si rompano di nuovo nelle versioni future di Django e non è più facile da implementare che trovare un altro widget del calendario JS e utilizzarlo.
Detto questo, ecco cosa devi fare se sei determinato a farlo funzionare:
Definisci la tua sottoclasse ModelForm per il tuo modello (meglio inserirla in forms.py nella tua app) e digli di usare AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (sostituisci 'mydate' ecc. Con i nomi dei campi appropriati del tuo modello):
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()
Cambia URLconf per passare 'form_class': ProductForm invece di 'model': Prodotto alla vista create_object generica (ciò significa "da my_app.forms importa ProductForm" anziché "da my_app.models import Product", ovviamente).
Nell'intestazione del modello, includere {{form.media}} per generare i collegamenti ai file Javascript.
E la parte caotica: i widget di data / ora dell'amministratore presumono che la roba di i18n JS sia stata caricata e richiedono anche core.js, ma non forniscono automaticamente nessuno dei due. Quindi nel modello sopra {{form.media}} avrai bisogno di:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Puoi anche utilizzare il seguente CSS amministratore (grazie Alex per averlo menzionato):
<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"/>
Ciò implica che il supporto di amministrazione di Django (ADMIN_MEDIA_PREFIX) è in / media / admin / - puoi cambiarlo per la tua configurazione. Idealmente, useresti un processore di contesto per passare questi valori al tuo modello invece di codificarlo, ma questo va oltre lo scopo di questa domanda.
Ciò richiede anche che l'URL / my_admin / jsi18n / sia cablato manualmente alla vista django.views.i18n.javascript_catalog (o null_javascript_catalog se non si utilizza I18N). Devi farlo tu stesso invece di passare attraverso l'applicazione di amministrazione in modo che sia accessibile indipendentemente dal fatto che tu abbia effettuato l'accesso all'amministratore (grazie Jeremy per averlo segnalato). Codice di esempio per URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Infine, se si utilizza Django 1.2 o versioni successive, è necessario un codice aggiuntivo nel modello per consentire ai widget di trovare i propri file multimediali:
{% 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>
Grazie lupefiasco per questa aggiunta.