禁用WTForms SelectField中的一个选项

时间:2017-06-05 23:08:52

标签: python flask-wtforms

将“禁用”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>

请有人说清楚。

3 个答案:

答案 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>