[解決済み] Django のフォームで、あるフィールドを編集できないように readonly (または disabled) にするにはどうしたらいいですか?
質問
Django のフォームで、フィールドを読み取り専用 (または無効) にするにはどうしたらいいですか?
しかし、レコードが更新モードになっているときは、いくつかのフィールドを読み取り専用にする必要があります。
例えば、新規に
Item
モデルでは、すべてのフィールドが編集可能でなければなりませんが、レコードを更新する際に
sku
フィールドを表示させ、編集できないようにすることはできますか?
class Item(models.Model):
sku = models.CharField(max_length=50)
description = models.CharField(max_length=200)
added_by = models.ForeignKey(User)
class ItemForm(ModelForm):
class Meta:
model = Item
exclude = ('added_by')
def new_item_view(request):
if request.method == 'POST':
form = ItemForm(request.POST)
# Validate and save
else:
form = ItemForm()
# Render the view
Canクラス
ItemForm
は再利用できますか?この場合
ItemForm
または
Item
モデルクラス?別のクラス、"を書く必要があるでしょうか。
ItemUpdateForm
"、アイテムの更新のために?
def update_item_view(request):
if request.method == 'POST':
form = ItemUpdateForm(request.POST)
# Validate and save
else:
form = ItemUpdateForm()
解決方法は?
で指摘されているように この回答 Django 1.9では フィールド.disabled 属性があります。
disabled ブーリアン引数を True に設定すると、disabled HTML 属性を使用してフォーム・フィールドを無効にし、ユーザーによる編集を不可能にします。ユーザーがサーバーに送信するフィールドの値を変更したとしても、それは無視され、フォームの初期データの値が優先されます。
Django 1.8 以前のバージョンでは、ウィジェットでの入力を無効にして悪意のある POST ハックを防ぐために、入力のスクラブを行う必要があります。
readonly
属性を設定します。
class ItemForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ItemForm, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.pk:
self.fields['sku'].widget.attrs['readonly'] = True
def clean_sku(self):
instance = getattr(self, 'instance', None)
if instance and instance.pk:
return instance.sku
else:
return self.cleaned_data['sku']
または、次のように置き換えます。
if instance and instance.pk
を、編集中であることを示す別の条件に置き換えてください。 また、属性
disabled
の代わりに入力フィールドに
readonly
.
は
clean_sku
関数は
readonly
の値で上書きされることはありません。
POST
.
そうでなければ、バインドされた入力データを拒否しながら値をレンダリングする Django の組み込みフォームフィールドは存在しません。 もしこれを望むのであれば、代わりに別の
ModelForm
で、編集不可能なフィールドを除外し、テンプレートの中でそれらを表示するだけです。
関連
-
6.5、Django - モデルでJSONFieldを使用してJSONフィールドでMySQLテーブルを作成する
-
[解決済み] Webフォームのフィールド/入力タグでブラウザのオートコンプリートを無効にするにはどうすればよいですか?
-
[解決済み] pipと要件ファイルを使って、特定のパッケージをアップグレードするにはどうすればよいですか?
-
[解決済み】Djangoでモデルインスタンスをシリアライズする方法は?
-
[解決済み] models.pyでDjangoの設定変数を参照するには?
-
[解決済み] Djangoアプリの命名規則はありますか?
-
[解決済み] Django: テンプレート内からセッション変数にアクセスする?
-
[解決済み] django のモデルのクラス名を取得する
-
[解決済み] django のユニットテストを複数のファイルに分散させるには?
-
[解決済み] ブロック %} に上書きではなく、追加することはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
6.5、Django - モデルでJSONFieldを使用してJSONフィールドでMySQLテーブルを作成する
-
[解決済み] Django のビューで 2 つ以上のクエリセットを結合するにはどうすればよいですか?
-
[解決済み] Djangoでファイルをアップロードする方法は?[クローズド]。
-
[解決済み] Djangoのテンプレートからsettings.pyの定数にアクセスすることは可能ですか?
-
[解決済み] django-rest-framework の管理者スタイルのブラウズ可能なインターフェイスを無効にする方法は?
-
[解決済み] Django で現在ログインしているユーザのユーザ ID を取得する方法は?
-
[解決済み] Djangoのvalues()の項目名を変更する方法は?
-
[解決済み] egg_infoエラーでpipからインストールできない
-
[解決済み] Django admin: データベースフィールドを持たないカスタム list_display フィールドの1つでソートする方法
-
[解決済み] Django: Django のアプリを完全にアンインストールするには?