Django フォームで、フィールドを読み取り専用 (または無効) にして編集できないようにするにはどうすればよいですか? 質問する

Django フォームで、フィールドを読み取り専用 (または無効) にして編集できないようにするにはどうすればよいですか? 質問する

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にはどのような変更が必要ですか?アイテムを更新するには、別のクラス「 」を記述する必要がありますか?ItemFormItemItemUpdateForm

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 属性を使用してフォーム フィールドが無効になり、ユーザーが編集できなくなります。ユーザーがサーバーに送信されたフィールドの値を改ざんした場合でも、フォームの初期データの値に置き換えられ、無視されます。

readonlyDjango 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属性を設定することもできます。disabledreadonly

この関数は、値が によって上書きされないclean_skuようにします。readonlyPOST

それ以外の場合、バインドされた入力データを拒否しながら値をレンダリングする組み込みの Django フォーム フィールドはありません。これが必要な場合は、ModelForm編集できないフィールドを除外する別のフィールドを作成し、テンプレート内に印刷する必要があります。

おすすめ記事