※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 ウィジェットと、国際化文字列の双方が svnに 取り込まれたので、紹介します。
localflavorはdjango.contrib.localflavorパッケージに含まれるもので、Djangoのi18n/l10nに対する取り組みの積極さを表しているとおもいます(adminもアラビア語等右から記述する言語に対応しています)。
私の作成したパッチの不備から、先日リリースされた0.96というバージョンには含まれておりません。
まずは、どのようなものなのかのスクリーンショットを見てください。
サンプルは、ユーザ(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のフィールド属性には、オールドフォームズのウィジェット設定がありますので、きっと近い将来設定できるようになるに違いない…。