【问题标题】:Dropdown selected value is not showing after selection flask?选择烧瓶后未显示下拉选择值?
【发布时间】:2020-06-01 23:58:07
【问题描述】:

如何使用从flask - render_template 预填充的 HTML <select> 下拉列表。

这是从 flask-jinja2 预填充的 <select> 下拉列表。

<div>
    <select class="test-default" id="testTime">
        {% for option in options %}
        <option value={{ option }}>{{ option }}</option>
        {% endfor %}
    </select>
</div>

test.html 中的脚本,

function fetch_test_data(){
    let test = $("#testTime").val();
    axios({ 
        method:"get",
        url:"/test",
        params: {
            test
        }
    }).then(function (response) {
        $(document.body).html(response.data)
    }); 
}

还有test.py 文件 - 带有应用程序路由和options 用于下拉菜单。

@app.route('/test', methods=["GET"])
@login_required
def transactions_view():
    options = ["0","7","14","30"]

    return render_template("test.html", options=options)

在上述情况下如何使用selected属性来显示选中的值。

当一个值被选中时, 正确的值返回到烧瓶并渲染回来。但是下拉可视化/列表显示第一个值而不是选定值?

我尝试过的:
我可以获得dropdown select 用于定义的下拉菜单。

defined-dropdown - 供参考

<div>
    <select class="test-default" id="testTime">
    <option value=0>today</option>
    <option value=7>week</option>
    <option value=14>fortnight</option>
    <option value=30>month</option>
    </select>
</div>

{{ time }}

我可以使用上面的下拉菜单:

<div>
    <select class="test-default" id="testTime">
    <option value=0 {% if time == 0 %} selected="selected" {% endif %}>today</option>
    <option value=7 {% if time == 7 %} selected="selected" {% endif %}>week</option>
    <option value=14 {% if time == 14 %} selected="selected" {% endif %}>fortnight</option>
    <option value=30 {% if time == 30 %} selected="selected" {% endif %}>month</option>
    </select>
</div>

{{ time }} 从 test.py 返回的地方

@app.route('/test', methods=["GET"])
@login_required
def transactions_view():
    time = (request.args.get("test"))
    return render_template("test.html", time=time)

【问题讨论】:

  • 将变量值解析为int,例如:int(time)
  • @Zanthoxylum-piperitum 为什么要给一个你事后放弃的问题加赏金?

标签: javascript python html flask jinja2


【解决方案1】:

您必须将transactions_view() 中的选定时间传递给模板,并在渲染期间测试每个选项的值。

首先,在test.py 中,您必须像这样修改transactions_view()

@app.route('/test', methods=["GET"])
@login_required
def transactions_view():
    options = (
        (0, 'today'),
        (7, 'week'),
        (14, 'fortnight'),
        (30, 'month'),
    )
    default_time = 0
    selected_time = int(request.args.get('time', default_time))

    return render_template("test.html", options=options, selected_time=selected_time)

这里我们将options 变量作为键标签对的元组,selected_time 变量保存GET 请求中选定时间的值或默认值。这两个变量都已传递给render_template 函数,因此我们可以在模板文件中访问它们。

test.html 模板文件中,您必须像这样修改for 循环:

<div>
  <select class="test-default" id="testTime">
    {% for time, label in options %}
    <option value="{{ time }}" {% if time == selected_time %}selected="selected"{% endif %}>{{ label }}</option>
    {% endfor %}
  </select>
</div>

这里我们测试每个选项的time值是否是选定的时间,并相应地设置selected属性。

【讨论】:

    【解决方案2】:

    在我看来,我们应该避免让我们的 html/渲染逻辑泄漏到我们的路由/控制器处理程序中。因此,对于上面的示例,您应该只对模板 html 进行更改。最后,我相信 javascript 比使用 jinja 条件更好、更干净。

    <!--  /templates/time.html -->
    {% 
       set time_lookup = { 
            0:  "Today",
            7:  "Week",
            14: "Fortnight",
            30: "Month",
        }
    %}
    <div>
        <select class="test-default" id="testTime">
            {% for option in options %}
               <option value={{ option }}>{{ time_lookup[option] }}</option>
            {% endfor %}
        </select>
    </div>
    <script>
    
    const urlParams = new URLSearchParams(window.location.search); 
    // current url and parse our query params "?test=201"
    
    const timeParam = urlParams.get("time") || "0";
    // default to 0
    
    const option = document.querySelector("select.test-time option[value=" + timeParam + "]") 
    // returns <option> HTMLElement where value === timeParam
    
    option.setAttribute("selected", true)
    // set <option selected="true"> on HTMLElement
    
    </script>
    

    【讨论】:

      【解决方案3】:

      axios 使用更新的 time 参数获取响应,但是您需要加载响应,即更新的 HTML,才能查看更新的时间。

      您可以如下所示更新您的 fetch_test_data 函数,以在下拉值更改时加载 HTML 响应。

      function fetch_test_data(){
          let test = $("#testTime").val();
          axios({ 
              method:"get",
              url:"/test",
              params: {
                  test
              }
          }).then(function (response) {
              $(document.body).html(response.data)
          }); 
      }
      

      如果您不需要使用 axios,而您只是想更新时间,下面的代码将在不发送请求的情况下执行此操作。

      <span id=timelabel>Default Time</span>
      
      
      <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
      <script>
      
          var label = document.getElementById('timelabel');
          var dropdown = document.getElementById('testTime');
      
          $("#testTime").on("change",function (evt) {
              label.textContent = dropdown.value;
          })
      </script>
      

      【讨论】:

      • 更新问题,请查收
      猜你喜欢
      • 2021-03-17
      • 2016-07-30
      • 2016-12-04
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多