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

2007/03/30 19:24

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

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

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

まずは、どのようなものなのかのスクリーンショットを見てください。

localflavor-1 localflavor-2

サンプルは、ユーザ(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))

使い方

郵便番号フィールドは、7桁の郵便番号(ハイフンありでも無しでも可)を受けて、ハイフン無しの7桁を返します。

デフォルトのウィジェットやフィールド(モデル用ではなくフォーム用のもの)がmodelに定義できて欲しいところです。modelのフィールド属性には、オールドフォームズのウィジェット設定がありますので、きっと近い将来設定できるようになるに違いない…。