Sự phức tạp ngày càng tăng của câu trả lời này theo thời gian và nhiều yêu cầu hack, có lẽ nên cảnh báo bạn không nên làm điều này. Nó dựa vào các chi tiết triển khai nội bộ không có giấy tờ của quản trị viên, có khả năng sẽ phá vỡ một lần nữa trong các phiên bản tương lai của Django và không dễ thực hiện hơn là chỉ tìm một tiện ích lịch JS khác và sử dụng tiện ích đó.
Điều đó nói rằng, đây là những gì bạn phải làm nếu bạn quyết tâm thực hiện công việc này:
Xác định lớp con ModelForm của riêng bạn cho mô hình của bạn (tốt nhất là đặt nó trong Forms.txt trong ứng dụng của bạn) và bảo nó sử dụng AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (thay thế 'mydate', v.v. bằng tên trường thích hợp từ mô hình của bạn):
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()
Thay đổi URLconf của bạn để chuyển 'form_group': ProductForm thay vì 'model': Sản phẩm sang chế độ xem chung tạo_object (nghĩa là "từ my_app.forms nhập ProductForm" thay vì "từ my_app.models nhập sản phẩm", tất nhiên).
Trong phần đầu của mẫu của bạn, bao gồm {{form.media}} để xuất các liên kết đến các tệp Javascript.
Và phần hacky: các widget ngày / giờ của quản trị viên giả định rằng các công cụ JS i18n đã được tải và cũng yêu cầu core.js, nhưng không tự động cung cấp một cái. Vì vậy, trong mẫu của bạn ở trên {{form.media}} bạn sẽ cần:
<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>
Bạn cũng có thể muốn sử dụng CSS quản trị sau (cảm ơn Alex đã đề cập đến điều này):
<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"/>
Điều này ngụ ý rằng phương tiện quản trị của Django (ADMIN_MEDIA_PREFIX) là tại / media / admin / - bạn có thể thay đổi điều đó cho thiết lập của mình. Lý tưởng nhất là bạn sử dụng bộ xử lý ngữ cảnh để chuyển các giá trị này vào mẫu của bạn thay vì mã hóa nó, nhưng điều đó nằm ngoài phạm vi của câu hỏi này.
Điều này cũng yêu cầu URL / my_admin / jsi18n / được kết nối thủ công với chế độ xem django.view.i18n.javascript_catalog (hoặc null_javascript_catalog nếu bạn không sử dụng I18N). Bạn phải tự làm việc này thay vì truy cập ứng dụng quản trị viên để có thể truy cập được bất kể bạn có đăng nhập vào quản trị viên hay không (cảm ơn Jeremy vì đã chỉ ra điều này). Mã mẫu cho URLconf của bạn:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Cuối cùng, nếu bạn đang sử dụng Django 1.2 trở lên, bạn cần một số mã bổ sung trong mẫu để giúp các widget tìm phương tiện của chúng:
{% 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>
Cảm ơn lupefiasco cho sự bổ sung này.