![](/img/trans.png)
[英]Render WTForms SelectField options with embedded HTML in Jinja
[英]disabling one of the options in WTForms SelectField
将“已禁用”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'})
在控制台中使用 print function 我可以看到正确的 output:
<option disabled="true" selected value="default">Select something</option>
该行工作正常,但不知何故此 output 未传递给模板。 相反,这是通过的:
<option selected value="default">Select something</option>
请有人说清楚。
当您禁用该字段时,不再传递值。 您可能想要做的是通过使用只读而不是禁用来传递变量。 以下是使用 jquery 的方法:
$('#id_of_option').prop('readonly', true);
另外我所做的是在 Wtforms 中设置选择
choices = [('', 'please select an option'), ('1', 'option 1'), ('2', 'option 2')]
这样用户必须选择一个值。
这是一个使用 SelectField 的选项迭代器的自定义 wtforms 小部件。
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")
如果你只是想要一个禁用和选择的选项作为你选择的第一个选项,我发现这比扩展 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>
这对我有用。
<select id="{{ form.my_select.id }}" name = "{{ form.my_select.name }}">
{% for option in form.my_select %}
{% if loop.first %}
{{ option(disabled="") }}
{% else %}
{{ option }}
{% endif %}
{% endfor %}
</select>
HTML 'disabled' 属性是 boolean 之一,在常规 HTML 中,它不需要分配给“”。 没有等号,我得到了一些位置参数错误。
如果您想禁用其他选项(例如,除了第一个选项之外的第 4 和第 5 个选项),您可以执行以下操作:
<select id="{{ form.my_select.id }}" name = "{{ form.my_select.name }}">
{% for option in form.my_select %}
{% if loop.first %}
{{ option(disabled="") }}
{% elif loop.index == 4 or loop.index == 5 %}
{{ option(disabled="") }}
{% else %}
{{ option }}
{% endif %}
{% endfor %}
</select>
请注意, loop.index 是从 1 开始的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.