忘れないようにメモ。
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(), ]