DjangoフォームにはRegexField
があり、これは通常のテキスト入力フィールドに非常に似ています。
私の見解では、特定の条件下でユーザーからそれを隠し、フォームをできる限り似た状態に保ちたいと考えています。このフィールドをHiddenInput
フィールドに変える最良の方法は何ですか?
私はフィールドに属性を設定できることを知っています:
form['fieldname'].field.widget.attr['readonly'] = 'readonly'
そして、私は希望の初期値を設定できます:
form.initial['fieldname'] = 'mydesiredvalue'
ただし、ウィジェットの形式は変更されません。
このフィールドを<input type="hidden">
フィールドにするための最良/最も「ジャンゴ-y」/最も「ハッキング」な方法は何ですか?
カスタムテンプレートとビューがある場合、フィールドを除外し、{{ modelform.instance.field }}
を使用して値を取得できます。
また、ビューで使用することもできます。
form.fields['field_name'].widget = forms.HiddenInput()
しかし、それが投稿の保存方法を保護するかどうかはわかりません。
それが役に立てば幸い。
便利な場合もあります:{{ form.field.as_hidden }}
まず、ユーザーにデータを変更させたくない場合は、フィールドを単純に除外する方が簡単です。それを隠しフィールドとして含めると、ネットワーク上に送信するデータが追加されるだけで、悪意のあるユーザーが望まないときに変更するように招待されます。フィールドを含めて非表示にする正当な理由がある場合は、キーワード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)
ビュー内のモデルフォームの内部を変更するよりもこのアプローチを好むが、それは好みの問題だ。
私のために働いたオプションは、元のフォームのフィールドを次のように定義します:
forms.CharField(widget = forms.HiddenInput(), required = False)
新しいクラスでオーバーライドすると、その場所が保持されます。
通常のフォームの場合
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()