在 Jinja 模板中为 select html 元素设置默认值?

Set default value for select html element in Jinja template?

我正在使用 flask/jinja 来制作一个简单的 Web 应用程序。我有一个 table 的记录,它取自数据库 table,并由加载记录列表的网页调用。在每一行的列上都有一个下拉列表(使用 select HTML 标记完成)。

我意识到下面的代码没有做它应该做的事情,目前最后一个选项(第四个)是自动 selected 因为 selected 标签。我把它留在这里是为了展示我要实现的目标。

理想情况下,我希望它检查当前记录的状态(下面代码中的 rec.status),并根据此 select 下拉列表中的适当项目。

HTML:

     <tbody>
            {% for rec in records %}
        <tr>
          <td>{{ rec.task }}</td>
          <td>
            <select>
              <option value ="zero" selected={{rec.status==0}}>Zero</option>
              <option value ="first" selected={{rec.status==1}}>First</option>
              <option value ="second" selected={{rec.status==2}}>Second</option>
              <option value ="third" selected={{rec.status==3}}>Third</option>
            </select>
          </td>
          <td><a href={{ "/update_status/"~rec.id}}>Update</a></td>
      </tr>
      {% endfor %}
      </tbody>

谢谢!

您走在正确的轨道上 - 但目前,您正在 select 框中的所有选项中打印 selected。你可以尝试这样的事情只打印 selected 在正确的选项上:

    <select>
      <option value="zero"{% if rec.status==0 %} selected="selected"{% endif %}>Zero</option>
      <option value="first"{% if rec.status==1 %} selected="selected"{% endif %}>First</option>
      <option value="second"{% if rec.status==2 %} selected="selected"{% endif %}>Second</option>
      <option value="third"{% if rec.status==3 %} selected="selected"{% endif %}>Third</option>
    </select>

对于未来的 Google 员工:

如果您正在使用 WTForms 并想在 Jinja 中设置默认选择,您可能会梦想这样的事情可以工作:

{{ form.gender(class='form-control', value='male') }}

但事实并非如此。 default='male'selected='male' 都没有(至少在 Jinja 2.8 和 WTForms 2.1 中对我来说不是)。

如果你很绝望,不想在你的 forms.py 中设置它,并且不介意有点 hacky,你可以这样做:

{{ form.gender(class='form-control hacky', value=data['gender']) }}

<script>
    var els = document.getElementsByClassName("hacky");
    for (i = 0; i < els.length; i++) {
        els[i].value = els[i].getAttribute('value');
    }
</script>

这会使用 JavaScript 在页面加载时设置它,并允许您在 SelectField 中传递默认选择,而不必弄乱您的 forms.py。在 Jinja 中可能有更好的方法,但我还没有找到它。

仅供参考-对于 HTML 5,selected="selected" 变成这样选择:

<option value="zero"{% if rec.status==0 %} selected{% endif %}>Zero</option>

只是对其他答案的一个小补充:您可以使用内联条件使其简短:

<option value="zero" {{'selected' if rec.status==0}}>Zero</option>

如果您使用另一个答案中提到的 WTForms,您可以在路由函数中设置默认值(但不要忘记按照 wtforms docs 中所述处理表单):

form = PreviouslyDefinedFlaskForm()
form.task.default = "third"
form.process()

这是另一种通过传递的变量动态设置所选值的方法:

route.py

def route():

    roles = ['admin', 'user', 'guest']
    user = get_user('John Doe')
    return render_template('template.html', user=user, roles=roles)

template.html

<!-- more code -->
<div class="form-group">
    <label for="user-role">Role</label>
    <select id="user-role" class="custom-select custom-dropdown custom-form-input">
        {% for role in roles %}
            {% if role == user.role %}
                <option value="{{ role.id }}" selected>{{ role }}</option>
            {% else %}
                <option value="{{ role.id }}">{{ role }}</option>
            {% endif %}
        {% endfor %}
    </select>
</div>
<!-- more code -->