Djangoの日本向けウィジェットを使う

2007年03月30日(金) 19:24

ウィジェットと、国際化文字列の双方がsvnに取り込まれたので、紹介します。


localflavorはdjango.contrib.localflavorパッケージに含まれるもので、Djangoのi18n/l10nに対する取り組みの積極さを表しているとおもいます(adminもアラビア語等右から記述する言語に対応しています)。

私の作成したパッチの不備から、先日リリースされた0.96というバージョンには含まれておりません。


まずは、どのようなものなのかのスクリーンショットを見てください。
localflavor-1
localflavor-1 posted by (C)everes
localflavor-2
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))


使い方

  1. 日本向けのlocalflavorはdjango.contrib.localflavor.jp.formsに含まれていますので、別名でインポートします。
  2. フォームをカスタマイズするために、モデルからデフォルトのフォーム(SendToForm)を生成します。
  3. フォームの郵便番号用フィールドをJPPostalCodeFieldに、フォームの郵便番号用フィールドの表示ウィジェットをJPPrefectureSelectに変更します。
  4. あとは、カスタマイズしたSendToFormを利用すれば、サンプルのような見た目になります。

郵便番号フィールドは、7桁の郵便番号(ハイフンありでも無しでも可)を受けて、ハイフン無しの7桁を返します。
デフォルトのウィジェットやフィールド(モデル用ではなくフォーム用のもの)がmodelに定義できて欲しいところです。modelのフィールド属性には、オールドフォームズのウィジェット設定がありますので、きっと近い将来設定できるようになるに違いない…。


今回のサンプルは下の関連コンテンツからダウンロードできます。


Feedbacks

Tags