python - Django 表格 : making a disabled field persist between validations

标签 python django django-forms

在某些时候,我需要显示 "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/

相关文章:

django - 将 gevent(或 eventlet)和 prefork worker 与 Celery 一起使用

javascript - 使用 django-dynamic-formset 创建表单集工厂时出错

Django,要上传图像(ImageField)或文件(FileField)

python - 如何使用 np.where() 创建特定行的新数组?

python - 如何等待对象不可点击?

xml - 将未转义的 html 插入 django 制作的 rss 提要中

python - nginx:[警告] 0.0.0.0:80 上的冲突服务器名称 "example.com",已忽略

python - Django 表单图像字段出现在 self.data 中但没有出现在 self.cleaned_data 中

python - 如何在进行多次读取时排除目录?

javascript - 注销后处理浏览器的后退和下一步按钮 Python