如果对象是None而不是做这样的事情,如何使jijna2中的变量默认为""?
{% if p %}
{{ p.User['first_name']}}
{% else %}
NONE
{%endif %}
Run Code Online (Sandbox Code Playgroud)
因此,如果对象p为None,我想将p(first_name和last_name)的值默认为"".基本上是nvl(p.User [first_name'],"")
接收错误:错误:jinja2.exceptions.UndefinedError UndefinedError:'None'没有属性'User'
我有一个整数
{% set curYear = 2013 %}
Run Code Online (Sandbox Code Playgroud)
在{% if %}语句中我必须将它与一些字符串进行比较.我不能curYear在开头设置字符串,因为我必须在循环中减少它.
我怎么转换它?
我的应用程序调用返回字典的API.我想在视图中将此dict中的信息传递给JavaScript.我特意在JS中使用Google Maps API,所以我想传递一个带有long/lat信息的元组列表.我知道这render_template会将这些变量传递给视图,因此可以在HTML中使用它们,但是如何将它们传递给模板中的JavaScript?
from flask import Flask
from flask import render_template
app = Flask(__name__)
import foo_api
api = foo_api.API('API KEY')
@app.route('/')
def get_data():
events = api.call(get_event, arg0, arg1)
geocode = event['latitude'], event['longitude']
return render_template('get_data.html', geocode=geocode)
Run Code Online (Sandbox Code Playgroud) 我想这样做:
{% for movie in movie_list | sort(movie.rating) %}
Run Code Online (Sandbox Code Playgroud)
但那不对......文档含糊不清......你怎么在Jinja2做到这一点?
默认情况下,使用内置服务器(Flask.run)运行Flask应用程序时,它会监视其Python文件,并在代码更改时自动重新加载应用程序:
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎仅适用于*.py文件,我似乎没有找到任何方法将此功能扩展到其他文件.最值得注意的是,当模板更改时让Flask重新启动应用程序非常有用.我已经不知道有多少次我在模板中摆弄标记并且因为没有看到任何变化而感到困惑,只是发现应用程序仍在使用旧版本的Jinja模板.
那么,有没有办法让Flask监控文件存在于模板目录中,还是需要深入到框架的源代码?
编辑:我正在使用Ubuntu 10.10.没有在任何其他平台上尝试过.
在进一步查询之后,我发现模板中的更改确实会实时更新,而无需重新加载应用程序本身.但是,这似乎只适用于传递给的那些模板flask.render_template.
但实际上,在我的应用程序中,我有很多可重复使用的参数化组件,我在Jinja模板中使用它们.它们被实现为{% macro %}s,驻留在专用的"模块"中并被{% import %}编入实际页面.所有不错和DRY ...除了那些导入的模板显然从未检查过修改,因为它们根本没有通过render_template.
(奇怪的是,对于通过调用的模板,这不会发生{% extends %}.至于{% include %},我不知道,因为我没有真正使用它们.)
总而言之,这种现象的根源似乎介于Jinja和Flask或Werkzeug之间.我想这可能需要为这些项目之一的bug追踪者旅行:)同时,我接受了jd.的回答是因为这是我实际使用的解决方案 - 而且它就像一个魅力.
如何url_for在Flask中使用引用文件夹中的文件?例如,我在static文件夹中有一些静态文件,其中一些可能在子文件夹中,如static/bootstrap.
当我尝试提供文件时static/bootstrap,我收到错误.
<link rel=stylesheet type=text/css href="{{ url_for('static/bootstrap', filename='bootstrap.min.css') }}">
Run Code Online (Sandbox Code Playgroud)
我可以引用不在子文件夹中的文件,这有效.
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='bootstrap.min.css') }}">
Run Code Online (Sandbox Code Playgroud)
引用静态文件的正确方法是什么url_for?如何使用url_for在任何级别生成静态文件的URL?
我有一个我要渲染的jinja2模板(.html文件)(用我的py文件中的值替换标记).但是,我想将其写入新的.html文件,而不是将渲染结果发送到浏览器.我认为django模板的解决方案也类似.
我怎样才能做到这一点?
我正在使用Flask微框架为我的服务器使用Jinja模板.我有父template.html和一些孩子child1.html,child2.html.其中一些孩子是相当大的html文件,我想以某种方式拆分它们,以便更好地清理我的工作.
main.py:
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
@app.route('/<task>')
def home(task=''):
return render_template('child1.html', task=task)
app.run()
Run Code Online (Sandbox Code Playgroud)
简化的template.html:
<!DOCTYPE html>
<html>
<head></head>
<body>
<div class="container">
{% block content %}{% endblock %}
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
魔术在child1.html中:
{% extends 'template.html' %}
{% block content %}
{% if task == 'content1' %}
<!-- include content1.html -->
{% endif %}
{% if task == 'content2' %}
<!-- include content2.html -->
{% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
而不是评论
<!-- include content1.html -->
Run Code Online (Sandbox Code Playgroud)
我有很多HTML文字.并且很难跟踪变化并且不会犯一些错误,这些错误很难找到和纠正.所以我想加载content1.html而不是在child1.html中编写所有内容.我遇到了这个问题 …
我想做的事情如下:
变量p来自test.py,它是一个列表['a','b','c','d']
{% for i in p %}
{{variable++}}
{{variable}}
Run Code Online (Sandbox Code Playgroud)
结果输出为:1 2 3 4
我在Flask中使用Jinja2模板提供动态页面.现在我在脚本标签中定义了Jinja2-clone Nunjucks中的客户端模板.问题是,客户端模板已类似语法<% %>是瓶的 Jinja2的解释,而不是可以解释渲染的逐字.
如何逐字渲染整个脚本块?