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

Ror*_*ory 117 html python django django-forms

我有一个带有a的django表单RegexField(与普通的文本输入字段非常相似).在我看来,在某些情况下,我想将其隐藏在用户之外,并尽量保持表单尽可能相似.

将这个领域变成一个HiddenInput领域的最佳方法是什么?我知道我可以在字段上设置属性<input type="hidden">,我可以设置所需的初始值RegexField.但是,这不会改变小部件的形式.

什么是使这个领域成为一个HiddenInput领域的最佳/最django-y /最少hacky方式?

sem*_*nte 183

它也很有用: {{ form.field.as_hidden }}

  • 这是恕我直言的最佳答案.我一直讨厌使用我的"控制器"Python代码来确定表单字段的显示. (3认同)

chr*_*e31 156

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

您也可以在视图中使用:

form.fields['field_name'].widget = forms.HiddenInput()
Run Code Online (Sandbox Code Playgroud)

但我不确定它会保护帖子上的保存方法.

希望能帮助到你.

  • 我最终得到了“” 使用此解决方案后,在 is_valid 方法中不是主键的有效值。` (2认同)
  • 在1.7上使用这种语法:```hidden_​​field_name = forms.CharField(label ='reset',max_length = 256,widget = forms.HiddenInput())```其中键是最新的小部件语法.根据您的需求进行调整. (2认同)

Sha*_*bak 51

一个适合我的选项,将原始形式的字段定义为:

forms.CharField(widget = forms.HiddenInput(), required = False)
Run Code Online (Sandbox Code Playgroud)

然后当你在新的类中重写它时它将保持它的位置.


ryc*_*ych 45

首先,如果您不希望用户修改数据,那么简单地排除该字段似乎更简洁.将其作为隐藏字段包含只是添加更多数据以通过网络发送,并邀请恶意用户在您不希望它们时对其进行修改.如果你有充分的理由包含该字段但隐藏它,则可以将关键字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.
Run Code Online (Sandbox Code Playgroud)

然后在你看来:

form = MyModelForm(hide_condition=True)
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法来修改视图中的模型形式的内部,但这是一个品味问题.

  • 只是简单的提示,kwargs.pop('hide_condition',False)而不是kwargs ['hide_condition'].你将处理no arg case,同时有一个default和del. (11认同)
  • 谢谢提示,christophe31。我已经根据您的建议进行了更新,因为它使代码更加清晰。 (2认同)
  • 用这种方法可以完全隐藏字段吗?就像您设置 `class Meta: except = ["fieldname"]` 一样。这里的问题是,元方法是“静态的”,但我需要动态的东西。请参阅http://stackoverflow.com/questions/20243735/django-show-admin-field-on-demand/20244351 (2认同)

anj*_*505 19

对于普通形式,你可以做到

class MyModelForm(forms.ModelForm):
    slug = forms.CharField(widget=forms.HiddenInput())
Run Code Online (Sandbox Code Playgroud)

如果您有模型表单,则可以执行以下操作

class MyModelForm(forms.ModelForm):
    class Meta:
        model = TagStatus
        fields = ('slug', 'ext')
        widgets = {'slug': forms.HiddenInput()}
Run Code Online (Sandbox Code Playgroud)

您也可以覆盖__init__方法

class Myform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(Myform, self).__init__(*args, **kwargs)
        self.fields['slug'].widget = forms.HiddenInput()
Run Code Online (Sandbox Code Playgroud)


Zag*_*ags 9

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

class MyForm(forms.Form):
    hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")
Run Code Online (Sandbox Code Playgroud)

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

form = MyForm()
if condition:
    form.fields["field_name"].widget = forms.HiddenInput()
    form.fields["field_name"].initial = "value"
Run Code Online (Sandbox Code Playgroud)