问题描述

我有一个带有 RegexField(与普通文本输入字段非常相似) 的 django 表单。在我看来,在某些情况下,我想把它从用户隐藏起来,并尽量保持形式尽可能相似。

将该字段转换为 HiddenInput 字段的最佳方式是什么?我知道我可以使用 form['fieldname'].field.widget.attr['readonly'] = 'readonly'在字段上设置属性,并且可以使用 form.initial['fieldname'] = 'mydesiredvalue'设置所需的初始值。但是,这不会改变窗口小工具的形式。

什么是最好的/大多数 django-y /最简便的方式使这个领域成为一个<input type="hidden"领域?

最佳解决方案

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

您也可以更喜欢在视图中使用:

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

但我不知道它会保护邮件的保存方法。

希望它有帮助。

次佳解决方案

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

第三种解决方案

首先,如果您不希望用户修改数据,那么简单地排除该字段似乎更为简洁。将其作为隐藏字段,只需添加更多数据通过电子邮件发送,并在不想要的时候邀请恶意用户进行修改。如果你有一个很好的理由来包含该字段但是隐藏它,你可以将一个关键字 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)

我更喜欢这种在视图中修改 modelform 内部的方法,但这是一个口味问题。

第四种方案

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

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

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛