2016-04-28 9 views
2

私は10個のDjangoクラスベースビューを持っており、それらを読み取り専用でユーザに表示したいと考えています。10個のDjangoクラスベースビューのReadonlyビュー

一部の値だけでなく、フォーム全体を読み取り専用にします。フォームを送信するのはクライアント(HTML)で無効にし、もう一度サーバーで無効にする(POSTは許可されません)。

ミックスインまたはシンプルのソリューションはありますか?ここで

+0

これはばかげているかもしれませんが、フォームを編集できない場合は、フォームとしてレンダリングするのはなぜですか?なぜ、普通の編集不可能なHTMLをレンダリングするだけではないのですか? – solarissmoke

+0

@solarissmoke私は同じことを2回することを避けたいと思います。私はデータをレンダリングしたい。フォームとしてレンダリングされるか、別の方法でレンダリングされるかは気にしません。フォームのレイアウトはすでに完了しています。だから私はそれを再利用したいのです。私は目標を気にしています。そこに行くための最も簡単な戦略を取っていきたいと思います:-) – guettli

答えて

5

は、2つの単純なことを行いミックスインです:

  • 設定したHTMLはdisabledreadonlyためのフォームのすべてのフィールドの属性。

  • CBVのform_validメソッドをオーバーライドして、モデル保存が行われないようにします。代わりに、テンプレートがレンダリングされます(送信されたデータがないかのように)。この方法では、ユーザーがフォームを送信してもアクションは発生しません。

テンプレートで完全なフォームをレンダリングすると、フォームフィールドエラーが無効なフィールドの横に表示されることがあります。フォームのエラー辞書を消去するか、各フィールドを個別にエラーなしでレンダリングして解決します。非モデルFormViewコントロールのためにこの概念を拡張

from django.views.generic.edit import FormMixin, ModelFormMixin 

class ReadOnlyModelFormMixin(ModelFormMixin): 

    def get_form(self, form_class=None): 

     form = super(ReadOnlyModelFormMixin, self).get_form() 

     for field in form.fields: 
      # Set html attributes as needed for all fields 
      form.fields[field].widget.attrs['readonly'] = 'readonly'   
      form.fields[field].widget.attrs['disabled'] = 'disabled' 

     return form 

    def form_valid(self, form): 
     """ 
     Called when form is submitted and form.is_valid() 
     """ 
     return self.form_invalid(form) 

は非常に簡単です。 FormMixinクラスから継承します。 :)あなたは、次のミックスインを使用することができ、クラスベースのビューのための一般的なPOST要求を許可しないように

+0

これはあらゆる種類のDjangoフィールドとウィジェットで機能しますか? – guettli

+0

'readonly'属性と 'disabled'属性は、クライアントが上書きできる要素ですが、要素の入力イベントを防ぐことができます([here](http://www.htmlcodetutorial.com/forms/_INPUT_DISABLED.html)参照)。 。 ** form_valid **メソッドは、CBVで定義されたフォーム/モデルフォームに対してGETまたはPOSTが行われるたびに実行されるアクションです。フォームが実際に有効なときに** form_invalid **メソッドを返すことで、これまでに「有効な提出」アクションはなく、ユーザーはフォームを送信して変更を行うことができなくなります。だから、要約すると、そうです:) –

1

:あなたはまた、特定のフォームフィールドなどを無効にしたい場合は

class DisallowPostMixin(object): 

    def post(self, request, *args, **kwargs): 
     return self.http_method_not_allowed(self, request, *args, **kwargs) 

あなたはイアンからget_formメソッドを追加することができます価格の答え。

0

ミドルウェアでハックすることができます。リクエスト時にビュー名とリクエストメソッドを確認します(ポストリダイレクトの場合)。レスポンス時には、response.contentにattrsを入力します。しかし、ミックスイン - 最高のソリューション。

関連する問題