daemonfreaks.com

Djangoの新規作成の汎用ビューでフォームのデフォルト値を設定したい

posted by jun-g at Sun, 07 Oct 2007 20:32 JST

汎用ビューの勉強がてら、views.pyを一切書かずにツールを作ってみるか、と思って試してみてるんやけど、いきなり躓いた。

作っているツールはちょっとしたメモ用のツールで、画面上、内容と日時を入力するテキストフィールドが表示される。この日時のフィールドにデフォルト値として現在日時を設定しておきたいんやけど、やり方がわからなかった。一応調べたとこまでメモ。

とりあえずdjango.views.generic.create_update.create_objectのソースを読んでみたところ、マニピュレータを自作して、flatten_data()メソッドを実装すれば良さそうな感じがしたので、さらにdjango.db.models.manipulatorsを読んで、モデルクラス内に以下のクラスを追加してみた。

class AddManipulator(models.manipulators.AutomaticAddManipulator):
    def flatten_data(self):
        now = datetime.now()
        return dict(
            rec_time_date = now.strftime('%Y-%m-%d'),
            rec_time_time = now.strftime('%H:%M:%S'))

しかし、ここで定義したクラスはまったく使われていない様子。python manage.py shellを起動して確認してみたところ、モデルのAddManipulatorは<class 'django.db.models.manipulators.AddManipulator'>を参照していたので、自分で定義したAddManipulatorクラスは自動マニピュレータで上書きされているっぽい。

ドキュメント見ても「このビューは、 Django モデルに付属の自動マニピュレータを使います。」って書いてあるしなー…。やっぱり汎用ビューを止めてviews.pyを書いたほうがいいのか…?

posted by pateo at Mon Oct 8 02:21:50 2007

ちょっと自分でも試してみました。

rec_time = models.DateTimeField(default=datetime.datetime.now())
models.pyのフィールドの定義のときにdefaultを指定して、
テンプレート側は、{{ form.rec_time_date }} {{ form.rec_time_time }}って書いたらデフォルトで入りました。

どうやらAddManipulatorの上書きはできないっぽいですね。

posted by jun-g at Mon Oct 8 09:12:32 2007

defaultって引数が存在したんですね。ってよく読むとドキュメントのモデルのページにもちゃんと書いてありますね…。
「auto_now」ばっかりに目がいって、「default」の存在に気づきませんでした…。

ありがとうございました!

posted by pateo at Mon Oct 8 22:18:40 2007

お役にたててよかったです: )

posted by uemura at Tue Oct 9 10:22:04 2007

はじめまして、

現在の汎用ビューのcreate_updateはManipulatorですが、
そのうちnewformsに変わるので、views.pyで書いてた方がいいような気がします。

そんなに面倒じゃないですし。

あとauto_now,auto_now_addは廃止する予定です。

posted by jun-g at Tue Oct 9 23:06:29 2007

はじめまして!コメントありがとうございます!

汎用ビューがnewformsベースに変わった際はインターフェースもごっそり変わってしまって、やはりcreate_update()などの関数は全て使えなくなってしまうのでしょうか…。汎用ビューがDjangoのセールスポイントの一つだと思ったので、oldformsベースでもとりあえず使ってみたほうが良いかなぁと思っていたのですが。

一覧/詳細等の参照系の画面は単純なので汎用ビューを使ったままにして、入力フォーム系の画面はフォームもマニピュレータも自作のものを使用できない制限もあるので、views.pyを書くようにしたいと思います。

Comments / TrackBacks

TrackBack URL for this entry: https://www.daemonfreaks.com/blog/trackback/200710072000








コメントスパム対策の為、各入力項目へのURL記載は全てリジェクトしてます。ごめんなさい。