anti scroll

ブラウザと小説の新しい関係を模索する

kay framework のCRUDでkey_nameを設定する

忘れないようにメモ。

kay frameworkでは汎用ビューグループという機能があって、データの追加、更新、削除などをやってくれる画面を自動作成することが出来ます。

しかしデータを追加する時、モデルにkey_nameを付けたいときはどうすればいいのか。

そこで、kay/utils/forms/modelform.py の786行を見ると、

If you define a form field named 'key_name' it will be treated specially and will be used as the value for the key_name parameter the Model constructor. This allows you to create instances with keys. The 'key_name' field will be ignored when updating an (although it will still be shown on the form).

とあるので、モデルデータをセーブするときに呼ばれる、CRUDViewGroupクラスの get_additional_context_on_create を継承して、返り値の辞書に"key_name"を追加すれば良さそうです。

抜粋したコードはこんな感じに。
 
CategoryモデルのCRUDを定義し、データの登録時にkey_nameを付けています。

# models.py
from google.appengine.ext import db

class Category(db.Model):
  name = db.StringProperty(required=True)

# forms.py
from kay.utils.forms.modelform import ModelForm
from myapp.models import Category

class CategoryForm(ModelForm):
    class Meta:
        model = Category

# urls.py
from kay.routing import (
    ViewGroup, Rule
    )
from kay.generics import crud
from kay.generics import admin_required

class CategoryCRUDViewGroup(crud.CRUDViewGroup):
    def get_additional_context_on_create(self, request, form):
        dic = crud.CRUDViewGroup.get_additional_context_on_create(self, request, form)
        dic["key_name"] = "_%s" % request.form.get("name") # key_nameを付ける!
        return dic

    model = "myapp.models.Category"
    form = "myapp.forms.CategoryForm"
    authorize = admin_required

view_groups = [
    ViewGroup(
        Rule("/", endpoint="index", view="myapp.views.index"),
        ),
    CategoryCRUDViewGroup(),
    ]