djangoとMySQL
djangoのバックエンドデータベースにMySQLを使い、日本語(UTF-8)のデータを扱いたい場合、データベースのデフォルトキャラクタセットをutf-8にしておかないとデータがtruncateされたというエラーメッセージがMySQLから返ってきます。
create database django_db set default character set utf8;
としてデータベースインスタンスを作ると大丈夫なようです。
django.newforms
いままでのdjango.formsを置き換える新しいクラス。フォームの表示、validation、再表示を司る。
ウィジェット: フォームエレメントに対応
フィールド:validationのためのクラス
フォーム:表示可能なフォーム
データベースやテンプレートとは独立している。
gentooでは、コマンド類は以下にインストールされる。
/usr/bin/django-admin.py
djangoプロジェクト
- 1つのプロジェクトに対し、接続するデータベースは1つ。
- 1つのプロジェクトに複数のアプリケーションが含まれる。
- 1つのホスト(サーバー)で複数のプロジェクトを運用することができる。
アプリケーションの作成はコマンドで行う。
% python manage.py startupp polls
アプリケーションは、アプリケーション名のディレクトリの下に作られる。
polls/
__init__.py
models.py
views.py
models.pyにはモデルクラスを書く。モデルクラスはWebアプリのデーターベース部分に対応する。モデルクラスは、1)データベースのスキーマ生成と2)それにアクセスするPythonコードの生成に使われる。
データベーステーブル作成は、
% python manage.py syncdb
モデルクラスを実装するには、models.Modelクラスを継承する。
settings.pyのROOT_URLCONF変数が参照される。ここにはクラスパスが指定されていて、'mysite.urls'などとなっているので、mysite/urls.pyが読み込まれURLディスパッチに使われる。
urls.pyには、urlpatterns変数があり、この変数がディスパッチテーブルとして使われる。
(r'^polls/(?P<poll_id>\d+)/$', 'mysite.polls.views.detail')
第2パラメータは起動するメソッド名で、上の例だと、mysite/polls/views.pyのdetail()が呼び出される。
<H1>テンプレーティング</H1>
django.templateがDjangoのテンプレーティングエンジン。
テンプレート使用の手順は、
- django.template.loader.get_template()を使って、テンプレートを読み込み、
- Key-ValueペアのContextを作り、
- template.render(Context)でレンダリング
となる。
from django.template import loader
from django.template import Context
my_template = loader.get_template('polls/index.html')
context = Context({'key': value})
my_template.render(context)
テンプレートの置き場所も、settings.pyによって指定され、TEMPLATE_DIRS変数で指定される。
1つ作ってみる
~/src/mysite/にて、
python manage.py startapp tango
単語追加ページ
/tango/add
まず単純にページを表示する。
def add(request):
render_to_response('tango/add.html', {})
テンプレートにフォームを追加する。まずはHTMLに入力フォームを直書き。送信されたフォームを同じメソッドで処理するため、送信先URL(actionフィールドの値)は、"./"とした。
送信されたフォームの受け取り
フォームはPOSTメソッドで受け取っているので、request.method == 'POST'でそれを検出し任意の処理をする。まずは何もせず、単純にリダイレクトをする。
リダイレクト
django.http.HttpResponseRedirectを使ってリダイレクトを行う。
return HttpResponseRedirect('./')
でパラメータなしの同じページにリダイレクトする。
デバッグログ
デバッグ情報の表示は単純に標準出力/標準エラー出力に文字列を出せば良い。print()でもOKそうだ。
TagManagerはdjango.db.models.Managerを継承するクラス。djangoのManagerクラスは、DBへのデータ取得などを担当するクラス。Tagクラスでは、self.objectsでTagManagerが参照できる。つまり、tag.objects.なんとか()とできる(のかな?)
TaggedItemクラスはself.tag = models.ForeignKey(Tag, related_name='items')というフィールドを持つ。これによって、TaggedItemはTagへのforeign keyを持ち、逆にTagは、それを参照するTaggedItemの集合に対してitemsでアクセスできる。