2010年10月29日金曜日

Django の管理(admin)インターフェースのカレンダーを通常のフォームでも使用する方法

Django管理(admin)インターフェースでは標準でカレンダーウィジットが提供されている。

管理インターフェースでない通常フォームでは、外部のカレンダーウィジットを使用してもよい。しかし、管理インターフェースと同一のカレンダーを利用したい場合、以下の設定で利用可能だ。

  1. テンプレートファイルのheaderタグ内に、次のjavascriptファイル記述を追加する。
    <script type="text/javascript" src="/jsi18n/"></script>
    <script type="text/javascript" src="/media/js/core.js"></script>
    <script type="text/javascript" src="/media/js/admin/RelatedObjectLookups.js"></script>
    <script type="text/javascript" src="/media/js/calendar.js"></script>
    <script type="text/javascript" src="/media/js/admin/DateTimeShortcuts.js"></script>
    
    さらに、次のcssファイル記述も追加する。
    <link rel="stylesheet" type="text/css" href="/media/css/base.css" />
    <link rel="stylesheet" type="text/css" href="/media/css/forms.css" />
    


  2. settings.py のurlpatterns に次の設定を追加する。
    (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', {'packages': 'django.conf'}),
    


  3. カレンダーウィジットで制御したいフォーム・フィールドに次のように変更を加える。
    通常 forms.py にて定義する。

    まず、ウィジットライブラリーをインポートする。
    from django.contrib.admin import widgets as adminwidget
    

    次に、制御したいフォーム・フィールドの weight引数に adminwidget.AdminDateWidgetを渡す。

    設定例
    class ItemForm(ModelForm):
        start_date = forms.DateField(label=u'日付',widget=adminwidget.AdminDateWidget)
        class Meta:
            model = Item
    
    強調表示のところで、start_date というフィールドにウィジットを設定している。

    設定例ではモデルフォームを利用している。つまり Itemモデルを利用したItemFormモデルフォームのクラスを定義し、変更が必要な箇所(ここではstart_date)だけ変更を行っている。

以上で設定は完了する。


実際の表示イメージを以下で示す。
カレンダーを設定したフィールド
の表示例
AdminDateWidget1.JPG
カレンダー・ウィンドウの表示例 AdminDateWidget2.JPG