我想将端点传递给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)
。
答案 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。