Djangoの日本向けウィジェットを使う
2007年03月30日(金) 19:24
ウィジェットと、国際化文字列の双方がsvnに取り込まれたので、紹介します。
localflavorはdjango.contrib.localflavorパッケージに含まれるもので、Djangoのi18n/l10nに対する取り組みの積極さを表しているとおもいます(adminもアラビア語等右から記述する言語に対応しています)。
私の作成したパッチの不備から、先日リリースされた0.96というバージョンには含まれておりません。
まずは、どのようなものなのかのスクリーンショットを見てください。

localflavor-1 posted by (C)everes

localflavor-2 posted by (C)everes
サンプルは、ユーザ(django.contrib.auto.models.User)に対して、送付先住所を設定するという簡単なものです。
頻出するであろう「郵便番号の入力チェック」と「都道府県の選択・入力チェック」の再発明せずに済むようになりました。
モデルのコートは通常と変わらないので、非常に単純です。
from django.db import models
from django.utils.translation import gettext as _
from django.contrib.auth.models import User
# Create your models here.
class SendTo(models.Model):
zip_code = models.CharField(_('Zip Code'), maxlength=8)
prefecture = models.CharField(_('Prefecture'), maxlength=9)
street = models.TextField(_('Street Address and Building'))
user = models.ForeignKey(User, verbose_name=_('User'))
def get_absolute_url(self):
return '/flavor/add/'
次に、viewsを見てみます。
from django import newforms as forms
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader, Context
from django.contrib.localflavor.jp import forms as jp_forms
from flavor.sample.models import SendTo
#customize form
SendToForm = forms.form_for_model(SendTo)
SendToForm.base_fields['zip_code'] = jp_forms.JPPostalCodeField()
SendToForm.base_fields['prefecture'].widget = jp_forms.JPPrefectureSelect()
def add_send_to(request):
if request.method == 'POST':
form = SendToForm(request.POST)
if form.is_valid() :
send_to = form.save()
return HttpResponseRedirect(send_to.get_absolute_url())
else:
form = SendToForm()
t = loader.get_template('sample/sendto_form.html')
c = Context({'form': form,})
return HttpResponse(t.render(c))
使い方
- 日本向けのlocalflavorはdjango.contrib.localflavor.jp.formsに含まれていますので、別名でインポートします。
- フォームをカスタマイズするために、モデルからデフォルトのフォーム(SendToForm)を生成します。
- フォームの郵便番号用フィールドをJPPostalCodeFieldに、フォームの郵便番号用フィールドの表示ウィジェットをJPPrefectureSelectに変更します。
- あとは、カスタマイズしたSendToFormを利用すれば、サンプルのような見た目になります。
郵便番号フィールドは、7桁の郵便番号(ハイフンありでも無しでも可)を受けて、ハイフン無しの7桁を返します。
デフォルトのウィジェットやフィールド(モデル用ではなくフォーム用のもの)がmodelに定義できて欲しいところです。modelのフィールド属性には、オールドフォームズのウィジェット設定がありますので、きっと近い将来設定できるようになるに違いない…。
今回のサンプルは下の関連コンテンツからダウンロードできます。
Trackbacks
[2007年03月31日(土) 00:54] きまぐれ事典