我有一个带有RegexField
的Django表单,它与普通的文本输入字段非常相似。
在我看来,在某些情况下,我想将其隐藏在用户之外,并尽量保持表单尽可能相似。将此字段转换为HiddenInput
字段的最佳方法是什么?
我知道我可以在字段上设置属性:
form['fieldname'].field.widget.attr['readonly'] = 'readonly'
我可以用:
设置所需的初始值form.initial['fieldname'] = 'mydesiredvalue'
但是,这不会改变小部件的形式。
将此字段设为<input type="hidden">
字段的最佳/最“django-y”/最少“hacky”方法是什么?
答案 0 :(得分:171)
它也很有用:{{ form.field.as_hidden }}
答案 1 :(得分:150)
如果您有自定义模板和视图,则可以排除该字段并使用{{ modelform.instance.field }}
来获取该值。
您也可以在视图中使用:
form.fields['field_name'].widget = forms.HiddenInput()
但我不确定它会保护帖子上的保存方法。
希望它有所帮助。
答案 2 :(得分:43)
首先,如果您不希望用户修改数据,那么简单地排除该字段似乎更简洁。将其作为隐藏字段包含只是添加更多数据以通过网络发送,并邀请恶意用户在您不希望它们时对其进行修改。如果你有充分的理由包含该字段但隐藏它,则可以将关键字arg传递给modelform的构造函数。也许是这样的事情:
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)
我更喜欢这种方法来修改视图中的模型形式的内部结构,但这是一个品味问题。
答案 3 :(得分:40)
对我有用的选项,将原始格式的字段定义为:
forms.CharField(widget = forms.HiddenInput(), required = False)
然后当你在新的类中覆盖它时,它将保持它的位置。
答案 4 :(得分:14)
对于普通表格,你可以做
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()
答案 5 :(得分:3)
如果您希望该字段始终被隐藏,请使用以下命令:
class MyForm(forms.Form):
hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")
答案 6 :(得分:-4)
您可以只使用css:
#id_fieldname, label[for="id_fieldname"] {
position: absolute;
display: none
}
这将使该字段及其标签不可见。