2009/06/22

"generic view" "verbose_name"

generic view が大好きさぁ〜
ってことは全然ないんですが済むなら済ましたいと思ってました

Model のインスタンスの詳細を表示するには django.views.generic.list_detail.object_detail 使います
object_detail は template に Model の instance を object という名前で渡します
そう、Model の instance だけ渡ってしまうのです、困りました
例えば
name = models.CharField(u'お名前', max_length=256)
なんてしてた場合
「お名前」にアクセスする方法が無いのです
でも template に「お名前」とか書き込むの嫌だしなぁ〜

でー、ググって出てきたページがこちら
とりあえず、な generic view の object_list の拡張 - muddy brown thang
            (以前略)
def render(self, name):
field_verbose_name = gettext(
self._queryset.model._meta.get_field(name).verbose_name)
(以下略)
まじっすか、_meta っすか

なんか、generic view で code の数減らそうとか言っといて
結局そんなもん持ち出さにゃいかんというのは何か辛くない?
そう思って先生にご相談申し上げてみたところ
「自分の設計をまず疑った方がいいっすよ」
「フォームを使わないのに使おうとしてる時点でおかしい」
「つかコード呼んでくださいよw」
「ipython で ?? を憶えてください。」
というあたたかいお言葉を沢山頂いたので不貞寝しました

つわけで _meta は 1 つの正解だったということみたいなんですが
form 使えばいいらしいということも聴いたので少し調べると
Model の instance は __dict__ って持っていて
まぁ幸い ModelForm は用意してたので dict を食わせてやったら
できた form の fields の中の field の label とかでも何とかなりました
    object_dict = object.__dict__
form = PersonForm(object_dict)
fields = [ {'label':y.label, 'value':object_dict[x]}
for (x, y) in form.fields.items()]
こんな感じ

ん〜、何か、間違っちゃないかしら、これでいいのかしら

0 件のコメント:

コメントを投稿