Semakin kompleksnya jawaban ini dari waktu ke waktu, dan banyak peretasan diperlukan, mungkin harus mengingatkan Anda untuk tidak melakukan ini sama sekali. Ini bergantung pada detail implementasi internal admin yang tidak berdokumen, kemungkinan akan pecah lagi di versi Django yang akan datang, dan tidak lebih mudah diimplementasikan daripada hanya menemukan widget kalender JS lain dan menggunakannya.
Yang mengatakan, inilah yang harus Anda lakukan jika Anda bertekad untuk membuat ini berfungsi:
Tentukan subclass ModelForm Anda sendiri untuk model Anda (terbaik untuk meletakkannya di forms.py di aplikasi Anda), dan katakan untuk menggunakan AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (ganti 'mydate' dll dengan nama bidang yang tepat dari model Anda):
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()
Ubah URLconf Anda untuk lulus 'form_class': ProductForm, bukan 'model': Produk ke tampilan create_object generik (itu berarti "dari my_app.forms impor ProductForm", bukan "dari my_app.models import Product", tentu saja).
Di bagian atas template Anda, sertakan {{form.media}} untuk menampilkan tautan ke file Javascript.
Dan bagian hacky: widget admin tanggal / waktu menganggap bahwa hal-hal JS i18n telah dimuat, dan juga memerlukan core.js, tetapi tidak menyediakan salah satu secara otomatis. Jadi dalam templat Anda di atas {{form.media}} Anda akan memerlukan:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Anda mungkin juga ingin menggunakan admin CSS berikut (terima kasih Alex karena menyebutkan ini):
<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"/>
Ini menyiratkan bahwa media admin Django (ADMIN_MEDIA_PREFIX) ada di / media / admin / - Anda dapat mengubahnya untuk pengaturan Anda. Idealnya Anda akan menggunakan pengolah konteks untuk meneruskan nilai-nilai ini ke template Anda alih-alih meng-hardcode-nya, tapi itu di luar cakupan pertanyaan ini.
Ini juga mensyaratkan bahwa URL / my_admin / jsi18n / secara manual ditransfer ke tampilan django.views.i18n.javascript_catalog (atau null_javascript_catalog jika Anda tidak menggunakan I18N). Anda harus melakukan ini sendiri alih-alih melalui aplikasi admin sehingga dapat diakses terlepas dari apakah Anda masuk ke admin (terima kasih Jeremy karena menunjukkan ini). Kode contoh untuk URLconf Anda:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Terakhir, jika Anda menggunakan Django 1.2 atau lebih baru, Anda memerlukan beberapa kode tambahan dalam templat Anda untuk membantu widget menemukan medianya:
{% 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>
Terima kasih lupefiasco untuk penambahan ini.