Google App Engine用フレームワーク「Kay」のgeneric view groupsをドキュメント「21. Using generic view groups — Kay v0.10.0 documentation」を参考にして使ってみました。
この機能を使うと、モデルとフォームを用意するだけで自動的にCRUDができる画面を作成してくれます。
インストールから初めて、generic view groupsの使い方を紹介します。
プロジェクトの作成
MercurialでKayを取得します。
$ hg clone https://kay-framework.googlecode.com/hg/ kay
新しいプロジェクトを作成します。
$ python kay/manage.py startproject myproject
続いて、アプリケーションを作成します。
$ cd myproject
$ python manage.py startapp myapp
settings.pyを編集し、myappを登録します。
settings.py
INSTALLED_APPS = (
'myapp',
)
APP_MOUNT_POINTS = {
'myapp': '/',
}
generic view groupsを使用する
ここからが本題です。
まずは、モデルを作成します。
myapp/models.py
# -*- coding: utf-8 -*-
# myapp.models
from google.appengine.ext import db
class MyModel(db.Model):
comment = db.StringProperty()
def __unicode__(self):
return self.comment
フォームを作成します。
myapp/forms.py
# -*- coding: utf-8 -*-
from kay.utils.forms.modelform import ModelForm
from myapp.models import MyModel
class MyForm(ModelForm):
class Meta:
model = MyModel
URLマッピングを設定します。
myapp/urls.py
# -*- coding: utf-8 -*-
# myapp.urls
from kay import generics
class MyCRUDViewGroup(generics.CRUDViewGroup):
model = 'myapp.models.MyModel'
form = 'myapp.forms.MyForm'
view_groups = [MyCRUDViewGroup()]
※2010年5月8日追記
Kayに「新しいURLマッピングが導入されました。」
URLマッピングの設定は「Kayの新しいURLマッピングによる汎用ビューグループの設定」をご覧ください。
kay.utils.flash.FlashMiddlewareを登録します。
settings.py
MIDDLEWARE_CLASSES = (
'kay.utils.flash.FlashMiddleware',
)
以上で一通りの設定が完了しました。
開発サーバを起動します。
$ python manage.py runserver
「http://localhost:8080/mymodel/list」にアクセスすると、MyModelの一覧が表示され、登録・修正・削除ができます。
テンプレートファイルをカスタマイズする
テンプレートファイルを変更します。
デフォルトのテンプレートファイルは、kay/_internal/templates/にあるgeneral_list.html・general_show.html・general_update.htmlです。
このファイルをmyapp/templates/にコピーして編集します。
general_list.html => mymodel_list.html
general_show.html => mymodel_list.html
general_update.html => mymodel_update.htm
urls.pyを編集し、テンプレートファイルの位置を設定します。
myapp/urls.py
class MyCRUDViewGroup(generics.CRUDViewGroup):
model = 'myapp.models.MyModel'
form = 'myapp.forms.MyForm'
templates = {
'show': 'myapp/mymodel_show.html',
'list': 'myapp/mymodel_list.html',
'update': 'myapp/mymodel_update.html'
}
「http://localhost:8080/mymodel/list」にアクセスすると、編集したテンプレートを使用して表示されます。
アクセス制限を行う
アクセス制限の設定を行います。
認証されたユーザーのみ、アクセスできるようにします。
今回は、データストアを利用した認証を使用します。
settings.pyに以下の項目を追加します。
settings.py
INSTALLED_APPS = (
'kay.auth', #追加
'myapp',
)
MIDDLEWARE_CLASSES = (
'kay.sessions.middleware.SessionMiddleware', #追加
'kay.auth.middleware.AuthenticationMiddleware', #追加
'kay.utils.flash.FlashMiddleware',
)
AUTH_USER_BACKEND = 'kay.auth.backends.datastore.DatastoreBackend' #追加
AUTH_USER_MODEL = 'kay.auth.models.DatastoreUser' #追加
ユーザーを作成します。
$ python manage.py shell
> from kay.auth import create_new_user
> create_new_user('admin','admin', is_admin=True) #管理者
> create_new_user('user','user', is_admin=False) #ユーザー
urls.pyのMyCRUDViewGroupのauthorize属性にアクセス制限の設定をします。
myapp/urls.py
class MyCRUDViewGroup(generics.CRUDViewGroup):
model = 'myapp.models.MyModel'
form = 'myapp.forms.MyForm'
authorize = generics.admin_required #管理者のみ
#authorize = generics.login_required #ログインユーザーのみ
#authorize = generics.only_owner_can_write #編集は作成者のみ
#authorize = generics.only_owner_can_write_except_for_admin #編集は作成者または管理者のみ
ログインしていない状態で「http://localhost:8080/mymodel/list」にアクセスすると、ログインフォームが表示されます。
adminでログインすると一覧が表示されますが、userでログインするとアクセス権限がないためにエラーになります。
モデルに作成したユーザーを登録する
モデルに作成したユーザーを登録します。
モデルに作成者を登録するためのプロパティを追加します。
myapp/models.py
# -*- coding: utf-8 -*-
# myapp.models
from google.appengine.ext import db
from kay.db import OwnerProperty #追加
class MyModel(db.Model):
comment = db.StringProperty()
owner = OwnerProperty() #追加
def __unicode__(self):
return self.comment
myapp/forms.py
# -*- coding: utf-8 -*-
from kay.utils.forms.modelform import ModelForm
from myapp.models import MyModel
class MyForm(ModelForm):
class Meta:
model = MyModel
exclude = ('owner',) #追加
「http://localhost:8080/mymodel/list」にアクセスして、新しいデータを登録します。
登録したデータは「http://localhost:8080/_ah/admin/datastore」で確認できます。
新たにデータを登録したとき、ログインしているとログインユーザーがownerに設定されます。
ログインしていないときは、Noneが設定されます。
追記
2010年6月8日 追記
CRUDViewGroup の場所が変更になりました。(参考:CRUDViewGroup を移動しました – kay-users-ja | Google グループ)
変更前 => kay.generics.CRUDViewGroup
変更後 => kay.generics.crud.CRUDViewGroup
Pingback: Kayのgeneric view groupsのURLマッピングを変更する。 | 山本隆の開発日誌