ModelFormのMultiChoiceFieldの初期値について

23 views
Skip to first unread message

yamamoto

unread,
May 2, 2010, 8:29:26 PM5/2/10
to kay-users-ja
山本と申します。

ModelFormのMultiChoiceFieldの初期値について教えてください。

フォームを表示したとき、モデルのStringListPropertyに設定した値が
選択された状態になりません。

以下のようなコードを書いているのですが、
MultiChoiceFieldの使い方に間違いがあるのでしょうか。

よろしくお願いします。

myapp/views.py

from google.appengine.ext import db
from kay.utils.forms.modelform import ModelForm

class MyModel(db.Model):
flags = db.StringListProperty()

class MyForm(ModelForm):
flags = forms.MultiChoiceField(choices=[u'Python', 'Perl', 'PHP'])
class Meta:
model = MyModel

def index(request):
model = MyModel(flags = [u'Python', 'PHP'])
form = MyForm(instance=model)
return render_to_response('myapp/index.html',
{'form':form.as_widget()})

myapp/templates/index.html

{{form()|safe}}

--
このメールは Google グループのグループ「kay-users-ja」の登録者に送られています。
このグループに投稿するには、kay-us...@googlegroups.com にメールを送信してください。
このグループから退会するには、kay-users-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/kay-users-ja?hl=ja からこのグループにアクセスしてください。

Takashi MATSUO

unread,
May 2, 2010, 11:16:41 PM5/2/10
to kay-us...@googlegroups.com
山本さん

ご報告ありがとうございます。modelform で monkey patch を当てている StringListProperty は
改行で分かつような挙動をしてしまうのが原因だと思います。

下記のようなクラスを作ってモデルの方で使用すれば行けそうです。
(form のコードは一緒で、model のプロパティだけ変更)
ちょっとお試しください。

from google.appengine.ext import db
class StringListPropertyPassThrough(db.StringListProperty):

def get_value_for_form(self, instance):
"""Extract the property value from the instance for use in a form.

This joins a list of strings with newlines.
"""
value = db.ListProperty.get_value_for_form(self, instance)
if not value:
return None
return value

def make_value_from_form(self, value):
"""Convert a form value to a property value.

This breaks the string into lines.
"""
if not value:
return []
return value


--
Takashi Matsuo
matsuo....@gmail.com
Kay's daddy



2010/5/3 yamamoto <x.yam...@gmail.com>:

yamamoto

unread,
May 3, 2010, 9:32:21 PM5/3/10
to kay-users-ja
山本です。
お世話になります。

> 下記のようなクラスを作ってモデルの方で使用すれば行けそうです。
> (form のコードは一緒で、model のプロパティだけ変更)
> ちょっとお試しください。

教えていただいた方法で正しく表示されました。
ありがとうございました。
Reply all
Reply to author
Forward
0 new messages