2011-01-15 6 views
-1

人物と「Eprint」出版物との多対多関係を形成する以下のモデルがあります。各個人のプロフィールページでは、このテーブルを通して、だけショー= Trueの場合、参照e-プリントが表示され、「注文」欄の数字の順に:django.formsはどれくらい私を助けますか?

class UsersEprint(models.Model): 
    person = models.ForeignKey(Person) 
    eprint = models.ForeignKey(emodels.Eprint) # this has a .title field 
    show = models.BooleanField(default=True) 
    order = models.IntegerField(default=0) 

さて、これは、すべての管理者から管理することができますが、ユーザーフレンドリーなフォームをサイトのユーザープロファイルページに入れたい。

理想的には、eprintのタイトル(編集不可)、「ショー」のティックボックス、「注文」の数値フィールドを含む、個人のeprintごとに1行のテーブルが必要です。 '削除'チェックボックスも便利です。

modelformsetsのデフォルトのアプローチでは、すべてのeprintをリストするeprintのドロップダウン・チューザーが表示されます。これは、フォームが編集したくないということを知らないためです。私は、フィールドやウィジェットをオーバーライドしてさまざまなアプローチを試しましたが、それはすべてちょっとしたクルージングに見えますが、私は最終的にテンプレートのフォームを行ごとにレンダリングするつもりです。

次の複雑さは、ユーザーがテーブル行を並べ替えるために番号を入力する代わりに、javascriptシステムを使用することができます - ドラッグする行をドラッグするか、矢印を上/下に移動します。ユーザーがフォームを送信すると、新しい注文が取得されます。

私の質問は、いつ私がdjangoのフォーム処理の範囲外に出ますか?私はちょうどインポートdjango.formsをドロップし、それを自分ですべて管理する必要がありますか?あるいは、最も厄介な形でも、そこにはまだ役に立つビットがありますか?

答えて

1

私はあなたのユースケースが特に厄介だとは思わないし、InlineModelFormsetがあなたのすべての要件をうまく処理できると確信しています。覚えておくべきことは、Djangoフォームの主な関心事は入力データのバリデーションです。 プレゼンテーションはあなた次第です(そして、そうする必要があります)。

確かに、Djangoはフォームレイアウト(as_ulなど)のためのいくつかの基本的なツールを提供していますが、あまりにも長持ちするべきではありません。あなたが イープリントを編集することはありませんので;-)

  1. をフォームがレンダリングされる方法をカスタマイズする「ハック」として見るべきではないが、機能することは、あなたがこのフィールド を除外することができますあなたは への inlinemodelformset_factoryへのあなたの下にあるフォームは、 テンプレートでは、ちょうど form.instance.eprint.title代わり form.eprint

  2. フォームセットにフォームをレンダリングする場合、あなたは確認することができ form.instance.showform.instance ポイント基礎となるモデル インスタンスに)表示 - それは Trueだ場合には、フォーム を通常通りレンダリングします。それ以外の場合は、フォームの コンテナに 「隠し」クラスを追加するか、フィールドを 隠し入力 (form.<FIELD>.as_hidden)としてレンダリングします。それは inlinemodelformset_factorycan_delete=Trueを渡すサーバー上の検証 エラー

  3. が 各 フォームに-DELETEチェックボックスが追加されます引き起こすよう は残念ながら、あなたは単に、 それらを省略することはできません。 jQueryを使用して thisを非表示にして、代わりに というボタンを表示することができます。クリックすると、ボタン がチェックボックスの値を設定し、 Djangoが残りを処理します。アイデアをthis snippetを見てみましょう - あなたは順序がjQueryのUIのような ツールキットを使用して処理することができ、このhere

  4. の 例を見ることができます。繰り返しますが、 プログレッシブエンハンスは何ですか? あなたはここにいます。すべてのスクリプトは となります。orderフィールドを更新し、送信時に Djangoが実際の保存を処理するようにします。 こうすることで、機能はJavascriptが探検し、実験することを恐れてはいけないクライアント

上で無効(または 欠席)した場合、まださえ 存在しています。 Djangoのすべてが文書化されているわけではありません(ルーキーソースを使用してください:)将来削除される可能性のある機能によっては心配する場合は、いつでもお問い合わせください。Django Users

+0

form.instanceプロパティは文書化されていますか?私はそれをソースで見ていますが、ドキュメントの中には何もありません。インスタンス=(例えばf = ArticleForm(インスタンス= a))でModelFormを作成する例がありますが、これはf.instanceがバインドされたオブジェクトを戻す方法であることを意味しません。モデルフォームとモデルオブジェクトの間の接続がどこにあるのか疑問に思っています...これは明らかですが、ドキュメント化されていないことが心配です。 – Spacedman

+0

あなたはそうです...それは文書化されていません。私はそれが 'Model._meta'のようなものだと思っています。両方ともとても有用です。最終的にはコア開発者がそれらを公式APIの一部にすることを願っています。 もちろん、何かがうまくいけば:) – elo80ka

1

この質問に対して「良い」答えはありませんが、個人的には範囲外です;)あなた自身が言うように、さまざまな魔法のレンダリングされたフィールドのタイプを制御できますが、それは "kludgy"を感じさせる。

また、あなたのJavaScriptシステムの背後にあるHTMLについて考えましたか?どのようなフォームが必要ですか?Djangoのフォーム処理によってレンダリングされたフォームが期待されていた場合、ビューはそれをどのように処理しますか?あなたはおそらくそれを行うことができますが、私は本当に醜い本当に速くなると思います。

私は、最初からフォームを使用してテンプレートを設計する方が良いと思います。残念ながら、バリデーションを行うには余計な作業が必要になりますが、フォームをあなたがしたいものとまったく同じようにするためにより多くの時間を費やすと思います。

これを繰り返すと、これは本当に助言ですが、私はあなたが標準のフォーム処理を使用できると確信していますが、同じことをしなければならないかどうかはわかりません。

+0

"いい答えだ! jQueryのjqgridプラグインが見つかったばかりですGoogleコードには休止状態のdjango-jqgridプロジェクトがあり、その他のWebリソースはたくさんあります。 – Spacedman

関連する問題