将django表单字段更改为隐藏字段

我有一个Django的forms与RegexField (这是非常类似于正常的文本input字段)。 在我看来,在某些情况下我想把这个隐藏起来,尽量保持表格尽可能的相似。

把这个字段变成HiddenInput字段的最好方法是什么? 我知道我可以使用form['fieldname'].field.widget.attr['readonly'] = 'readonly'设置字段的属性form['fieldname'].field.widget.attr['readonly'] = 'readonly' ,我可以用form.initial['fieldname'] = 'mydesiredvalue' 。 但是,这不会改变小部件的forms。

什么是最好的/最django-y /至lesshacky的方式来使这个领域的<input type="hidden"字段?

如果您有自定义模板和视图,则可以排除该字段并使用{{ modelform.instance.field }}来获取该值。

你也可能更喜欢在视图中使用:

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

但是我不确定它会保护后期保存方法。

希望能帮助到你。

它也可以是有用的: {{ form.field.as_hidden }}

首先,如果您不希望用户修改数据,那么简单地排除该字段似乎更清晰。 将它作为隐藏字段添加只是增加了更多的数据通过networking发送,并邀请恶意用户修改它,当你不希望他们。 如果您确实有足够的理由来包含该字段但将其隐藏,则可以将关键字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的字段为:

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

那么当你在新的类中覆盖它时,它将保持它的位置。

对于正常forms,你可以做

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

如果你模型的forms,你可以做到以下几点

 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()