Зростання складності цієї відповіді з часом, і багато необхідних хакерів, ймовірно, повинні застерегти вас від цього взагалі. Він покладається на незадокументовані деталі внутрішньої реалізації адміністратора, ймовірно, знову вийде з ладу у майбутніх версіях Django, і це не легше реалізувати, ніж просто знайти інший віджет календаря JS та використовувати його.
Однак, ось що вам потрібно зробити, якщо ви вирішили зробити цю роботу:
Визначте свій власний підклас ModelForm для вашої моделі (найкраще помістити його у form.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 замість "моделі": продукт до загального перегляду create_object (це означатиме, "звичайно, з my_app.forms імпортувати продуктForm", а не "з 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 (дякую Алексу за те, що згадував про це):
<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 за це доповнення.