繁体   English   中英

禁用 WTForms SelectField 中的选项之一

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM