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

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

在我看来,在某些情况下,我想对用户隐藏它,并试图保持表单尽可能相似。将这个字段转换为 HiddenInput字段的最佳方法是什么?

我知道我可以使用以下方法在字段中设置属性:

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

我可以设置所需的初始值:

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

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

使该字段成为 <input type="hidden">字段的最佳/最“ django-y”/最“ hacky”的方法是什么?

240876 次浏览

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

你也可以在视图中使用:

field = form.fields['field_name']
field.widget = field.hidden_widget()

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

具有多个值的 field 不支持 HiddenInput 作为输入类型,因此对该字段使用默认的隐藏输入小部件。

希望能有帮助。

首先,如果您不希望用户修改数据,那么简单地排除该字段似乎更为明智。包含它作为一个隐藏字段只是增加了更多的数据通过电线发送,并邀请恶意用户修改它时,你不希望他们。如果确实有很好的理由包含字段但是隐藏它,那么可以向模型的构造函数传递一个关键字 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)

相对于在视图中修改模型表单的内部结构,我更喜欢这种方法,但这是一个口味问题。

这可能也很有用: \{\{ form.field.as_hidden }}

一个对我有用的选项,在原始形式中定义字段为:

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

然后当您在新的 Class 中重写它时,它将保留它的位置。

对于正常形式,你可以这样做

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

你可以使用 css:

#id_fieldname, label[for="id_fieldname"] {
position: absolute;
display: none
}

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

如果希望始终隐藏该字段,请使用以下命令:

class MyForm(forms.Form):
hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")

如果希望字段有条件隐藏,可以执行以下操作:

form = MyForm()
if condition:
form.fields["field_name"].widget = forms.HiddenInput()
form.fields["field_name"].initial = "value"

模型示例:

Models.py

from django.db import models




class YourModel(models.Model):
fieldname = models.CharField(max_length=255, default="default")

在表单中,可以使用 ModelForm 添加小部件

表格 py

from .models import YourModel
from django import forms




class YourForm(forms.ModelForm):




class Meta:
model = YourModel
fields = ('fieldname',)


widgets = {
'fieldname': forms.TextInput(attrs={'type': 'hidden'}),
}

如果您不知道如何将它添加到 views.py 文件中,这里有一些关于它的视频。

如果你使用 基于函数的视图:

Https://www.youtube.com/watch?v=6oohlchkx2u


如果你使用 基于类的视图:

Https://www.youtube.com/watch?v=kb_wdxbwhua

\{\{ form.field}}
\{\{ form.field.as_hidden }}

使用这种 jinja 格式,我们既可以有可见的表单字段,也可以有隐藏的表单字段。

如果您想隐藏和禁用字段以保护其中的数据。正如其他人提到的,使用 hiddenInput 小部件并禁用它

表格 Init

例如:

        if not current_user.is_staff:
self.base_fields['pictureValid'].disabled = True
self.base_fields['pictureValid'].widget = forms.HiddenInput()

Render _ field很容易 {% render _ field form.field hide = True% }