web-dev-qa-db-ja.com

Djangoフォームフィールドを非表示フィールドに変更します

DjangoフォームにはRegexFieldがあり、これは通常のテキスト入力フィールドに非常に似ています。

私の見解では、特定の条件下でユーザーからそれを隠し、フォームをできる限り似た状態に保ちたいと考えています。このフィールドをHiddenInputフィールドに変える最良の方法は何ですか?

私はフィールドに属性を設定できることを知っています:

form['fieldname'].field.widget.attr['readonly'] = 'readonly'

そして、私は希望の初期値を設定できます:

form.initial['fieldname'] = 'mydesiredvalue'

ただし、ウィジェットの形式は変更されません。

このフィールドを<input type="hidden">フィールドにするための最良/最も「ジャンゴ-y」/最も「ハッキング」な方法は何ですか?

115
Rory

カスタムテンプレートとビューがある場合、フィールドを除外し、{{ modelform.instance.field }}を使用して値を取得できます。

また、ビューで使用することもできます。

form.fields['field_name'].widget = forms.HiddenInput()

しかし、それが投稿の保存方法を保護するかどうかはわかりません。

それが役に立てば幸い。

153
christophe31

便利な場合もあります:{{ form.field.as_hidden }}

178
semente

まず、ユーザーにデータを変更させたくない場合は、フィールドを単純に除外する方が簡単です。それを隠しフィールドとして含めると、ネットワーク上に送信するデータが追加されるだけで、悪意のあるユーザーが望まないときに変更するように招待されます。フィールドを含めて非表示にする正当な理由がある場合は、キーワードargをモデルフォームのコンストラクターに渡すことができます。おそらくこのようなもの:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def __init__(self, *args, **kwargs):
        from Django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(MyModelForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['fieldname'].widget = HiddenInput()
            # or alternately:  del self.fields['fieldname']  to remove it from the form altogether.

次に、あなたの意見で:

form = MyModelForm(hide_condition=True)

ビュー内のモデルフォームの内部を変更するよりもこのアプローチを好むが、それは好みの問題だ。

44
rych

私のために働いたオプションは、元のフォームのフィールドを次のように定義します:

forms.CharField(widget = forms.HiddenInput(), required = False)

新しいクラスでオーバーライドすると、その場所が保持されます。

43
Shay Rybak

通常のフォームの場合

class MyModelForm(forms.ModelForm):
    slug = forms.CharField(widget=forms.HiddenInput())

モデルフォームがある場合、次のことができます

class MyModelForm(forms.ModelForm):
    class Meta:
        model = TagStatus
        fields = ('slug', 'ext')
        widgets = {'slug': forms.HiddenInput()}

__init__メソッドをオーバーライドすることもできます

class Myform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(Myform, self).__init__(*args, **kwargs)
        self.fields['slug'].widget = forms.HiddenInput()
16