如何在Flask中将字典传递给url_for

时间:2019-08-08 08:58:36

标签: python flask

我想将端点传递给url_for,其中端点包含{<1>}参数,其中 name 是变量。

基本上,我有多个模板,如果我可以传递参数变量名称,则可以将其折叠为一个模板。解决方案可能是通过字典,但可能还有其他方法。我绝对可以通过对jinja生成的html在呈现之前进行后处理来实现。

我尝试了所有我能想到的包括嵌套name=value的技巧。

所以在我的路线代码结尾

{{ }}

实际上,我有很多路线用于不同主题(客户,产品,发票),而 all 都是以此方式结束的。因此,对于每个主题,我需要一个看起来像这样的jinja模板。

# routes.py
...
@bp.route('/customer/add/prompt/<customer_id>',methods = ['POST', 'GET'])
@login_required
def customer_add_prompt(customer_id):
    #code code code
    return render_template('customer_add.html',
        customer_id = customer_id)

当用户提交表单时,将遵循# customer_add.html ... <form action = "{{ url_for(customer_add, customer_id = customer_id) }}" method = "POST"> <-- html htlm htlm --> </form> 的端点,customer_add期望并传递customer_add(或任何值)。

这是问题所在。我应该能够像这样组合所有模板。

customer_id = 1234

然后像这样渲染它。

# subject_add.html
...   
<form action = "{{ url_for(subject_target, subject = subject_id) }}" method = "POST">       
    <-- html htlm htlm -->
</form>

执行此操作时,我收到一条错误消息,说# routes.py ... @bp.route('/customer/add/<customer_id>',methods = ['POST', 'GET']) @login_required def customer_add_prompt(customer_id): #code code code subject_target = 'customer_add.html' subject = 'customer_id' subject_id = customer_id return render_template(subject_target, subject = subject_id)

测试表明Could not build url for endpoint 'customer_add' with values ['subject']. Did you forget to specify values ['entity_id']?subject_target被罚款。但是subject_id并不能代替,因为在subject语法中,它是一个参数名称,并且端点期望的是名为url_for的变量的值,而不是customer_id

我希望有一种方法可以说出Jinja中的参数名称。概括地说,我可能想传递参数字典。

理想情况下,我可以像这样subject传递d = {'subject': x, ...},当x = 1234时,Jinja会认为它等效于url_for(subject_action, d)

2 个答案:

答案 0 :(得分:3)

您可以将参数添加到url_for()。按照docs

  

目标端点未知的变量参数是   作为查询参数附加到生成的URL

这样您就可以

<form action = "{{ url_for(action_target, 
                           subject_type=subject_id, 
                           2nd_variable=2nd_variable, 
                           etc...) }}" method = "POST">

但是正如wonka所说,最好将数据作为POST参数发送。

如果我误解了您在您的视图中尝试通过render_template调用传递数据的方法,那么您也可以这样做。

return render_template('template_name.html', 
                        data={
                            "action_type": "action",
                            "subject_type": subject_value
                        })  

然后您可以使用{{data["subject_type"]}}

在模板中进行访问

答案 1 :(得分:0)

答案很明显。

而不是使用jinja在模板中评估url_for,而是在路线中对其进行评估,然后通过render_template将结果传递给jinja。