2012年3月26日月曜日

Django 1.4 の嬉しいところ

前のブログを書いていた正にその時に Django 1.4 が出ていました(汗)。 この 1.4 で個人的に特に嬉しかったのが

  • プロジェクトやアプリケーションの生成に、自前のテンプレートが使える
  • i18n_patterns を使って、多言語のURL振り分けができる

の2点。これと django-multilingual-model を使えば、多言語ブログが あっと言う間に作れる...はず...です。

i18n_patterns の使い方ですが、多言語にしたいパターンだけを i18n_patterns に することで実現できるようです。

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns

urlpatterns = patterns(
    url('^admin/', include(admin.site.urls)),
)
urlpatterns += i18n_patterns('',
    url(r'^about/$', 'about.view', name='about'),
)

としておくと

from django.core.urlresolvers import reverse
from django.utils.translation import activate

>>> activate('en')
>>> reverse('about')
'/en/about/'

>>> activate('ja')
>>> reverse('about')
'/ja/about/'

となってくれる筈。まだ試していませんが... さて、ちょっと作ってみます。

2012年3月23日金曜日

django-multilingual-model が素敵

Plone で作成していたサイトが、突然壊れてしまい、 それ以来自宅サーバ上のサイトをPloneで続けるか、 それともDjangoで作り直すか思案していたのですが、 Djangoでも多言語化が簡単にできそうなツールをみつけたので そろそろ自宅サイトを復活しようと思っています。 自宅で暇を見つけてはちまちま書いていくつもりなので、 いつになるか分かりませんが、それまではグーグルさんの お世話になります。

さて、そのツールとは、 django-multilingual-modelこちら のオリジナルを整形して、見やすくなっています。

これをインストールすると、以下のようなモデルを

class Book(models.Model):
    ISBN = models.IntegerField()
    title = models.CharField(max_length=32)
    description = models.TextField()

以下のように変更する事で、title と description が多言語化されます。

from multilingual_model.models import MultilingualModel
from multilingual_model.models import MultilingualTranslation

class BookTranslation(MultilingualTranslation):
    class Meta:
        unique_together = ('parent', 'language_code')

    parent = models.ForeignKey('Book', related_name='translations')

    title = models.CharField(max_length=32)
    description = models.TextField()

class Book(MultilingualModel):
    ISBN = models.IntegerField()

つまり、翻訳したいアイテムだけを、MultilingualTranslation から継承した クラスに移動して、元のモデルは、MultilingualModel から継承するように 変更するだけ。素晴しい!

しかも、admin 入力も用意されていて、

from django.contrib import admin
import models

from multilingual_model.admin import TranslationInline

class BookTranslationInline(TranslationInline):
   model = models.BookTranslation

class BookAdmin(admin.ModelAdmin):
   list_display = ["ISBN"]
   inlines = [BookTranslationInline]

admin.site.register(models.Book, BookAdmin)

こんな風に登録すると、ちゃんと言語別の入力フィールドを用意して くれるのです。来週には国際化も更に強化された Django 1.4 が 正式リリースされるようですし、ここは一念発起してサイトを作り直すしますか。