時間の経過とともにこの答えがますます複雑になり、多くのハックが必要になるので、おそらくこれを行うことに対して警告する必要があります。管理者の文書化されていない内部実装の詳細に依存しており、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
from my_app.forms import ProductForm
from my_app.models import Product
テンプレートの先頭に{{ form.media }}
、Javascriptファイルへのリンクを出力するためのインクルードを含めます。
そして、ハッキーな部分:admin date / timeウィジェットは、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ビュー(またはI18Nを使用していない場合はnull_javascript_catalog)に手動で接続する必要もあります。管理者にログインしているかどうかに関係なくアクセスできるように、管理者アプリケーションを経由するのではなく、自分でこれを行う必要があります(これを指摘してくれたJeremyに感謝します)。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に感謝します。