2010年10月26日火曜日

Django で JavaScript を使う

Djangoでは、forms継承クラス内のMediaクラスに、JavaScript及びcssを設定するという方法がある(ようである)。しかしこの方法は今のところ良く分からない。

他に、テンプレート内にJavaScriptを設定する方法がある。これについては以下順番に説明する。

  1. テンプレートのヘッダータグ内に、使用するJavaScriptライブラリーとユーザー定義外部ファイルを記述する。

    設定例
    <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-1.4.2.js"></script>
    <script type="text/javascript" src="{{ MEDIA_URL }}js/main.js"></script>
    
    設定例では JavaScriptライブラリとして jquery-1.4.2.js を、ユーザー定義外部ファイルとして main.js を指定している。

    JavaScriptファイルの位置指定として、MEDIA_URL 変数を利用する。



  2. MEDIA_URL 変数を有効にするために settings.py にて設定を行う。

    1. MEDIA_URL の設定

      メディアのURLを設定する。

      設定例 設定例では ローカルホストに site_media/ を付けて指定している。

      この時サーバー名以降のパス(/site_media/の部分)が、ADMIN_MEDIA_PREFIX 変数と同じだと ADMINの処理に優先されてしまい設定が動かなくなる。このため、重複しないようにする。


    2. MEDIA_ROOT の設定

      MEDIA_ROOT変数にMEDIAを置くディレクトリーを設定する。

      MEDIA_ROOT は MEDIA_URL変数の参照とは直接は関係無い。しかし静的ファイルの提供として次で設定する urls.py にて使用しているので取り敢えず設定する。

      直接パスを設定しても良いが、プロジェクトやサーバーが変わった場合など、いちいち変更する必要があるため、次のように設定するのが良い。

      設定例
      import os
      PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
      MEDIA_ROOT = os.path.join(PROJECT_PATH, 'site_media')
      
      PROJECT_PATH にはプロジェクトのパスを設定。MEDIA_ROOT にはプロジェクト・ディレクトリー下の site_media というディレクトリーが設定される。
      (設定されるパス例 MEDIA_ROOT="C:\xxx\myprj\site_media")

      なお、os.path を利用するためには、osパッケージをインポートする必要がある。


  3. 静的ファイル提供の設定 (urls.py の設定)

    Djangoでは静的ファイルの提供方法として、django.views.static.serve() ビューがある。しかしこれは、非効率的 かつ 安全ではない 。

    Djangoドキュメント  静的なファイルの提供方法
    Djangoドキュメント  Apacheとmod_wsgi環境でDjangoを使う方法


    開発中のみの利用を前提として、静的ファイル提供ためのDjango設定について以下説明する。

    1. urls.py の urlpatterns に MEDIA_URLで指定したパターンを追加する。
      (ここでは site_media/ )

      (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes':True}),
      
      パラメーター document_root に先ほど設定した MEDIA_ROOT を指定している。

      またパラメーター show_indexes に True を指定しているがこの設定で、MEDIA_URL のアドレスでディレクトリーリストを表示することができる。


    2. 追加したurlパターン中に settings.MEDIA_ROOT を定義に使用している。このため、urls.py で settings.py をインポートする必要がある。

      from django.conf import settings
      


    3. 上記2つの設定で静的ファイル提供の設定は完了する。しかし、urls.py の定義を開発・本番に使い分けるのは面倒なので、以下のように urls.py を記述すると良い。

      from django.conf.urls.defaults import *
      from django.conf import settings
        
      urlpatterns = patterns('',
          (r'^admin/', include(admin.site.urls)),
          (r'^index/','myprj.myapp.views.index'),
      )
        
      if settings.DEBUG:
          urlpatterns += patterns('',
              (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes':True}),
          )
      
      強調部分が今回の urls.py の設定箇所。

      if setting.DEBUG の部分は開発中にしか動かない。

      これは開発中は、settings.py 中で DEBUG=True と設定しているためだ。逆に本番環境では DEBUG=False と設定変更する必要がある。


以上で JavaScript 利用の設定は完了する。今回の設定では JavaScript ファイルは MEDIA_ROOT で指定したディレクトリー下に置けば良い。
ちょっと複雑だが一度設定すれば、簡単に JavaScript を活用することができる。