You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask与Vue.js集成时下拉选择列表选项不显示问题求助

问题原因
  • 这个问题是Flask默认模板引擎Jinja2与Vue.js的插值语法冲突导致的:两者默认都使用{{ 变量名 }}作为插值表达式标识,你在模板中写的{{ opt }}会先被Jinja2解析,由于你没有给渲染模板的render_template方法传入名为opt的变量,Jinja2会直接把这部分内容替换为空字符串,所以Vue运行时无法拿到要渲染的选项文本。
解决方案

有三种常用的解决方式,按需选择即可:

方案1:使用Jinja2的raw标签标记无需解析的内容

在需要保留Vue插值语法的代码外层包裹{% raw %}和{% endraw %},告诉Jinja2这部分内容不需要解析,直接输出即可,你的select代码修改后如下:

<div class="col-sm-10">
    <select class="form-select" v-model="reftools">
        <option value="" selected="true" disabled="disabled"></option>
        <option v-for="opt in status_reftools" v-bind:value="opt">{% raw %}{{ opt }}{% endraw %}</option>
    </select>
</div>

如果页面中Vue控制的区域较大,也可以直接把整个Vue挂载节点(#section_formulaire)包裹在raw标签对里,不需要逐个修改插值内容。

方案2:修改Vue的默认插值分隔符

修改Vue的配置,将插值语法的分隔符换成和Jinja2不冲突的格式,比如[[ 变量名 ]],修改你的JS代码中创建Vue实例的部分:

// 原来的创建代码
// Vue.createApp(Form).mount('#section_formulaire');

// 修改后的代码
const app = Vue.createApp(Form)
// 自定义插值分隔符
app.config.compilerOptions.delimiters = ['[[', ']]']
app.mount('#section_formulaire')

之后HTML里的Vue插值语法同步修改为对应的格式即可:

<option v-for="opt in status_reftools" v-bind:value="opt">[[ opt ]]</option>

方案3:将前端页面作为静态文件提供

如果你不需要在这个HTML页面中使用Jinja2的模板能力,可以直接把HTML文件放到Flask项目的static文件夹下,直接访问静态文件资源,不走Jinja2的模板渲染流程,自然不会有语法冲突问题。

内容的提问来源于stack exchange,提问作者Balkhrod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:36:06