将“禁用”html属性分配给WTForms中SelectField的其中一个选项的最简单方法是什么?
这是我之前的代码
<select class="form-control" name="division" data-error="Required!" required>
<option value="default" disabled selected>Select something</option>
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
</select>
正如您所见,我想将“禁用”设置为第一个选项。
我完成此任务的代码是:
next(form.division.__iter__())(**{'disabled':'true'})
在控制台中使用打印功能我可以看到正确的输出:
<option disabled="true" selected value="default">Select something</option>
该行正在运行,但不知何故此输出未传递给模板。 相反,这是通过的:
<option selected value="default">Select something</option>
请有人说清楚。
答案 0 :(得分:1)
禁用该字段时,不再传递值。您可能想要做的是使用只读而不是禁用来传递变量。以下是如何使用jquery:
$('#id_of_option').prop('readonly', true);
我所做的就是在Wtforms中设置选项
choices = [('', 'please select an option'), ('1', 'option 1'), ('2', 'option 2')]
这样一来,用户就必须选择一个值。
答案 1 :(得分:0)
这是一个自定义wtforms小部件,它使用SelectField的Options迭代器。
from markupsafe import Markup
from wtforms.widgets.core import html_params
class CustomSelect:
"""
Renders a select field allowing custom attributes for options.
Expects the field to be an iterable object of Option fields.
The render function accepts a dictionary of option ids ("{field_id}-{option_index}")
which contain a dictionary of attributes to be passed to the option.
Example:
form.customselect(option_attr={"customselect-0": {"disabled": ""} })
"""
def __init__(self, multiple=False):
self.multiple = multiple
def __call__(self, field, option_attr=None, **kwargs):
if option_attr is None:
option_attr = {}
kwargs.setdefault("id", field.id)
if self.multiple:
kwargs["multiple"] = True
if "required" not in kwargs and "required" in getattr(field, "flags", []):
kwargs["required"] = True
html = ["<select %s>" % html_params(name=field.name, **kwargs)]
for option in field:
attr = option_attr.get(option.id, {})
html.append(option(**attr))
html.append("</select>")
return Markup("".join(html))
声明字段时,将CustomSelect
的实例作为widget
参数。
division = SelectField(
"Division",
choices=[("default", "Select something"), ("option1", "Option 1"), ("option2", "Option 2")],
validators=[InputRequired()],
widget=CustomSelect(),
default="default",
)
并在渲染时传递属性
form.division(option_attr={"division-0": {"disabled": ""} }, class="form-control")
答案 2 :(得分:0)
如果您只是想将禁用并选中的选项作为选择的第一个选项,我发现这比扩展SelectField类要简单:
只需遍历该选项并检查第一次循环迭代
<select name="my_select" id="my_select">
{% for option in form.my_select %}
{% if loop.first %}
<option value="" disabled selected>select something</option>
{% endif %}
{{ option }}
{% endfor %}
</select>