Django 表单中的只读字段

Posted

技术标签:

【中文标题】Django 表单中的只读字段【英文标题】:Read-Only Field in Django Form 【发布时间】:2017-05-07 10:05:01 【问题描述】:

如何在 Django 表单中将字段设置为只读?我知道如何禁用一个字段,但这不是我想要的。任何帮助,将不胜感激。

【问题讨论】:

是模型形式吗?你能告诉更多你需要什么 是的,它是一个ModelForm的CharField。 ***.com/questions/324477/… 【参考方案1】:

您可以在定义Field 时使用可选的attrs 参数。也就是说:

somefield = forms.CharField(
    widget=forms.TextInput(attrs='readonly':'readonly')
)

【讨论】:

【参考方案2】:

django 1.9 中的 Field.disabled 属性可用:https://docs.djangoproject.com/en/1.9/ref/forms/fields/#disabled

disabled 布尔参数,当设置为 True 时,使用 disabled html 属性禁用表单字段,这样用户就无法编辑它。即使用户篡改了提交给服务器的字段值,它也会被忽略,取而代之的是表单初始数据中的值。

否则

使用小部件的“只读”属性

class PatientForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
       super(PatientForm, self).__init__(*args, **kwargs)
       self.fields['field'].widget.attrs['readonly'] = True

    class Meta:
        model = Patient

【讨论】:

这里的 Django 文档显然是错误的;在使用 disabled 属性的情况下,不会忽略该值以支持表单的初始数据;该值根本没有传递。【参考方案3】:

Django 1.9+:

somefield = forms.CharField(disabled=True)

【讨论】:

需要注意的重要一点是字段为disabled时不会提交到服务器。如果您希望发布字段数据,请使用readonly 没有名为“readonly”的属性,如果有请提出解决方案。 --谢谢 是的 readonly 不是核心字段参数。所以使用其他答案。例如。 field.widget.attrs['readonly'] = True @stephen 我认为您的最后一个答案应该添加到回复中,因为它是拯救我一天的答案:)【参考方案4】:

这是我让它在 Js 中工作的唯一方法:

function myFieldOnChange() 
    var myField= document.getElementById("myFieldID")
    myField.setAttribute('readonly', true)

【讨论】:

前面有 1000 种设置方式... 创建与后面输入表单同名的 HTML 输入并提交 from 也可以。 <input id="myFieldID" name="backEndFieldName" readonly> 会工作

以上是关于Django 表单中的只读字段的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 中的只读表单字段是个坏主意?

Django 表单中的只读字段

Django使用小部件创建一个只读的表单字段

Django Admin中的动态只读字段

如何在 django 模型表单中添加自定义字段?

模板中的只读表单,django