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

时间:2011-07-28 16:19:40

标签: python html django django-forms

我有一个带有RegexField的Django表单,它与普通的文本输入字段非常相似。

在我看来,在某些情况下,我想将其隐藏在用户之外,并尽量保持表单尽可能相似。将此字段转换为HiddenInput字段的最佳方法是什么?

我知道我可以在字段上设置属性:

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

我可以用:

设置所需的初始值
form.initial['fieldname'] = 'mydesiredvalue'

但是,这不会改变小部件的形式。

将此字段设为<input type="hidden">字段的最佳/最“django-y”/最少“hacky”方法是什么?

7 个答案:

答案 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
}

这将使该字段及其标签不可见。