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
クラスは再利用できますか?またはモデル クラスItemForm
にはどのような変更が必要ですか?アイテムを更新するには、別のクラス「 」を記述する必要がありますか?ItemForm
Item
ItemUpdateForm
def update_item_view(request):
if request.method == 'POST':
form = ItemUpdateForm(request.POST)
# Validate and save
else:
form = ItemUpdateForm()
ベストアンサー1
指摘されているようにこの答えDjango 1.9では、フィールド無効属性:
disabled ブール引数を True に設定すると、disabled HTML 属性を使用してフォーム フィールドが無効になり、ユーザーが編集できなくなります。ユーザーがサーバーに送信されたフィールドの値を改ざんした場合でも、フォームの初期データの値に置き換えられ、無視されます。
readonly
Django 1.8 以前では、ウィジェットへのエントリを無効にして悪意のある POST ハッキングを防ぐには、フォーム フィールドに属性を設定するだけでなく、入力をスクラブする必要があります。
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
編集できないフィールドを除外する別のフィールドを作成し、テンプレート内に印刷する必要があります。