私は10個のDjangoクラスベースビューを持っており、それらを読み取り専用でユーザに表示したいと考えています。10個のDjangoクラスベースビューのReadonlyビュー
一部の値だけでなく、フォーム全体を読み取り専用にします。フォームを送信するのはクライアント(HTML)で無効にし、もう一度サーバーで無効にする(POSTは許可されません)。
ミックスインまたはシンプルのソリューションはありますか?ここで
私は10個のDjangoクラスベースビューを持っており、それらを読み取り専用でユーザに表示したいと考えています。10個のDjangoクラスベースビューのReadonlyビュー
一部の値だけでなく、フォーム全体を読み取り専用にします。フォームを送信するのはクライアント(HTML)で無効にし、もう一度サーバーで無効にする(POSTは許可されません)。
ミックスインまたはシンプルのソリューションはありますか?ここで
は、2つの単純なことを行いミックスインです:
設定したHTMLはdisabled
とreadonly
ためのフォームのすべてのフィールドの属性。
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
要求を許可しないように
これはあらゆる種類のDjangoフィールドとウィジェットで機能しますか? – guettli
'readonly'属性と 'disabled'属性は、クライアントが上書きできる要素ですが、要素の入力イベントを防ぐことができます([here](http://www.htmlcodetutorial.com/forms/_INPUT_DISABLED.html)参照)。 。 ** form_valid **メソッドは、CBVで定義されたフォーム/モデルフォームに対してGETまたはPOSTが行われるたびに実行されるアクションです。フォームが実際に有効なときに** form_invalid **メソッドを返すことで、これまでに「有効な提出」アクションはなく、ユーザーはフォームを送信して変更を行うことができなくなります。だから、要約すると、そうです:) –
:あなたはまた、特定のフォームフィールドなどを無効にしたい場合は
class DisallowPostMixin(object):
def post(self, request, *args, **kwargs):
return self.http_method_not_allowed(self, request, *args, **kwargs)
あなたはイアンからget_form
メソッドを追加することができます価格の答え。
ミドルウェアでハックすることができます。リクエスト時にビュー名とリクエストメソッドを確認します(ポストリダイレクトの場合)。レスポンス時には、response.contentにattrsを入力します。しかし、ミックスイン - 最高のソリューション。
これはばかげているかもしれませんが、フォームを編集できない場合は、フォームとしてレンダリングするのはなぜですか?なぜ、普通の編集不可能なHTMLをレンダリングするだけではないのですか? – solarissmoke
@solarissmoke私は同じことを2回することを避けたいと思います。私はデータをレンダリングしたい。フォームとしてレンダリングされるか、別の方法でレンダリングされるかは気にしません。フォームのレイアウトはすでに完了しています。だから私はそれを再利用したいのです。私は目標を気にしています。そこに行くための最も簡単な戦略を取っていきたいと思います:-) – guettli