在某些时候,我需要显示 "disabled"
(由 disabled="disabled"
属性变灰)"select"类型的输入
。按照标准(xhtml 和 html4)的规定,"select"
类型的输入不能有 "readonly"
属性。请注意,这仅用于演示目的,实际值必须在 POST 中结束。所以这就是我所做的(引用 django 中的表单声明的一部分):
from django import forms
_choices = ['to be', 'not to be']
class SomeForm(forms.Form):
field = forms.ChoiceField(choices=[(item, item) for item in _choices],
widget=forms.HiddenInput()) # the real field
mock_field = forms.ChoiceField(required=False, # doesn't get submitted
choices=[(item, item) for item in _choices],
label="The question",
widget=forms.Select(attrs={'disabled':'disabled'}))
然后是这样初始化的:
initial_val = 'to be'
form = SomeForm(ititial={'field':initial_val,
'mock_field':initial_val})
一切都很好。好吧,直到表单得到验证并且其他字段之一未通过验证。发生这种情况时,将重新加载表单并保留值,但不会保留“mock_field”之一 - 它从未提交(已禁用)。所以没有保存下来。虽然这不会影响数据完整性,但在表示方面仍然不太好。
有什么方法可以保留该字段,同时尽可能减少黑客攻击?表单是 django.contrib.formtools.FormWizard
的一部分,初始值(和一些字段)是动态生成的。基本上,已经有很多事情在进行,如果可以不使事情过于复杂,那就太好了。
最佳答案
浏览器不会发布禁用的字段。
您可以尝试将 field
的初始值复制到 Form 的 __init__
中的 mock_field
def __init__(self, *args, **kwargs):
super(SomeForm, self).__init__(*args, **kwargs)
mock_initial = self.fields['field'].initial
self.fields['mock_field'].initial = mock_initial
代码未经测试。通常你也会关心 form.data
,但在这种情况下,它与 initial
关于python - Django 表格 : making a disabled field persist between validations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596054/