【问题标题】:How do I set the variables in this javascript file to match variables from Flask/Python?如何设置此 javascript 文件中的变量以匹配来自 Flask/Python 的变量?
【发布时间】:2021-12-29 04:32:37
【问题描述】:

我有一个启用动态下拉菜单的 Javascript 文件(即,从一个下拉菜单中进行选择会影响其他下拉菜单)。我想将此文件与多个表单结合使用,但我已将此文件中的起始变量硬编码为 html 元素“inverter_oem”和“inverter_model_name”。

在其他形式中,我需要引用不同的对象。

我怎样才能做到这一点? 我想以这种方式在 Javascript 中创建变量:

const selecting_dropdown_menu = document.getElementById(variable1_from_flask);
const filtered_dropdown_menu = document.getElementById(variable2_from_flask);

我目前的方法是尝试使用 render_template 从 Flask 路由传递变量。 (我也尝试过其他堆栈溢出解决方案,但没有运气)

@db_queries.route('/db_query_dynamic_form/<form_name>', methods=['GET', 'POST'])
def db_query_dynamic_form(form_name):
    # use methods to get form and endpoint for outside loop

    if request.method == 'POST':
        # inside loop when form complete
        return render_template('list.html', result=query_results["filtered_tables"], columns=query_results["column_names"])

    # added variable to pass to jinja template
    return render_template(form_endpoint["endpoint"], form=form_endpoint["form"], var="value1")

jinja模板形式如下

% extends "base.html" %}
{% block title %}Inverter Dynamic  Search{% endblock %}
{% block heading %}Inverter Dynamic Search{% endblock %}
{% block content %}

  <form method="POST">
    {{ form.hidden_tag()}}
    {{ form.inverter_oem.label }}{{ form.inverter_oem }}<br>
    {{ form.inverter_model_name.label }}{{ form.inverter_model_name }}<br>
    {{form.submit()}}

    {{test}}
  </form>
    <script>
      myVar = {{ var }}
    </script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="{{ url_for('static', filename='search_inverter_dynamic.js') }}"></script>


{% endblock %}

但是,当我尝试时,我在 javascript 文件中没有得到值

console.log(myVar);

这是带有“硬编码”变量的原始 JScode

//acquire inverter_oem value from form
const inverter_oem_select = document.getElementById('inverter_oem');
const inverter_model_name_select = document.getElementById('inverter_model_name');

//add event listener to capture selected oem in dropdown
inverter_oem_select.addEventListener('click', (e) => {
    let oem = '../modelNameByOEM//' +  e.target.value;
    console.log(oem);
    getIt(oem);
});

//recover a JSON containing the list of models from a specific oem
async function getIt(input) {
    try {
        const res = await axios.get(input);
        console.log(res.data);
        optionHTML = '';
        for (let modelName of res.data.modelNameOem) {
            //console.log(res.modelName.name);
            optionHTML += '<option value="' + modelName.name + '">' + modelName.name + '</option>';
            //console.log(optionHTML);
        }
        inverter_model_name_select.innerHTML = optionHTML;

    } catch (err) {
        console.log('Could not reach endpoint modelNameByOEM')
        console.log(err);
    };
}

【问题讨论】:

  • 您能否包含更多的 JS 代码,包括如何使用选定的元素?除了按 ID 进行选择,您可以使用 CSS 类吗?
  • 好的,我会添加整个原始文件

标签: javascript python flask jinja2


【解决方案1】:

Jinja 不知道您要在 JavaScript 环境中传递变量,因此它无法自动在字符串变量周围添加引号。它只是用value1 替换{{ var }} 导致语法错误。加引号就可以在JS环境中访问myVar了:

<script>
myVar = "{{ var }}"
</script>

注意:如果您想传递更复杂的数据结构和/或用户提交的值,您应该查看安全呈现数据的tojson filter

【讨论】:

  • 它适用于 Dauros,谢谢!我正在查找引号允许在 Jinja 文档中传递变量但找不到解释的原因。你能详细说明为什么会这样吗? Jinja 是否将该变量作为带引号的字符串传递,然后 JS 代码将“{{ var }}”作为变量读取?
  • 在渲染过程中,Jinja 查找特定于 Jinja 的语句/表达式,例如 {{ var }}{% if some_other_var %} 并评估它们。所谓的 mustache 语法:{{ var }} 告诉 Jinja 它应该寻找一个名为 var 的 Python 变量,并将模板中的整个 {{ var }} 术语替换为 var 的值。但是在您的模板中,您必须确保将替换的值放置在正确的环境中。在您的情况下:var 是一个字符串,因此您必须在声明时将引号括起来。 Jinja 在其自身背景之外一无所知。
  • 知道了!非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
相关资源
最近更新 更多