Растущая сложность этого ответа с течением времени и множество необходимых взломов, вероятно, должны предостеречь вас от этого вообще. Он полагается на недокументированные внутренние детали реализации администратора, и, скорее всего, снова сломается в будущих версиях Django, и его легче реализовать, чем просто найти другой виджет календаря JS и использовать его.
Тем не менее, вот что вам нужно сделать, если вы полны решимости сделать эту работу:
Определите свой собственный подкласс ModelForm для вашей модели (лучше всего поместить его в forms.py в вашем приложении) и попросите его использовать AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (замените «mydate» и т. Д. Соответствующими именами полей от вашей модели):
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()
Измените свой URLconf так, чтобы он передавал «form_class»: ProductForm вместо «model»: Product в общее представление create_object (что будет означать «из my_app.forms import ProductForm» вместо «из my_app.models import Product». ", конечно).
В заголовке шаблона добавьте {{form.media}} для вывода ссылок на файлы Javascript.
И хакерская часть: административные виджеты даты / времени предполагают, что загружен материал i18n JS, а также требуют core.js, но не предоставляют ни один из них автоматически. Так что в вашем шаблоне выше {{form.media}} вам понадобится:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Вы также можете использовать следующий CSS для администратора (спасибо Alex за упоминание этого):
<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"/>
Это означает, что административный носитель Django (ADMIN_MEDIA_PREFIX) находится в / media / admin / - вы можете изменить это для своей настройки. В идеале вы должны использовать контекстный процессор для передачи этих значений в шаблон вместо жесткого кодирования, но это выходит за рамки этого вопроса.
Для этого также необходимо, чтобы URL / my_admin / jsi18n / был вручную подключен к представлению django.views.i18n.javascript_catalog (или null_javascript_catalog, если вы не используете I18N). Вы должны сделать это самостоятельно, вместо того, чтобы проходить через приложение администратора, чтобы оно было доступно независимо от того, вошли ли вы в систему администратора (спасибо Джереми за это указание). Пример кода для вашего URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Наконец, если вы используете Django 1.2 или более позднюю версию, вам понадобится дополнительный код в вашем шаблоне, чтобы помочь виджетам найти свое медиа:
{% 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>
Спасибо lupefiasco за это дополнение.