如何向模板添加传递模型特定的URL.比方说,我想构建一个编辑链接.我猜,使用uri_for()函数将是一个简单的方法.
但以下给出了"UndefinedError:'webapp2'未定义"
{% webapp2.uri_for("editGreeting", greeting.key().id()) %}
Run Code Online (Sandbox Code Playgroud)
或者我应该在MainPage-Request-Handler中准备这些?如果是这样,我不知道如何将它们添加到每个问候语中.
以下代码示例取自:http: //webapp-improved.appspot.com/tutorials/gettingstarted/templates.html
控制器/处理器
class MainPage(webapp2.RequestHandler):
def get(self):
guestbook_name=self.request.get('guestbook_name')
greetings_query = Greeting.all().ancestor(
guestbook_key(guestbook_name)).order('-date')
greetings = greetings_query.fetch(10)
if users.get_current_user():
url = users.create_logout_url(self.request.uri)
url_linktext = 'Logout'
else:
url = users.create_login_url(self.request.uri)
url_linktext = 'Login'
template_values = {
'greetings': greetings,
'url': url,
'url_linktext': url_linktext,
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
Run Code Online (Sandbox Code Playgroud)
模板/视图:
<html>
<body>
{% for greeting in greetings %}
{% if greeting.author %}
<b>{{ greeting.author.nickname }}</b> wrote:
{% else %}
An anonymous person wrote:
{% …Run Code Online (Sandbox Code Playgroud) 我有一个Jinja2模板,如下所示:
<form action="" method=post>
<table>
<tr>
<th></th>
<th>ID</th>
<th>Title</th>
</tr>
{% for page in pages %}
<tr>
<td><input type=checkbox name=do_delete value="{{ page['id'] }}"></td>
<td>{{ page['id'] }}</td>
<td><a href="{{ page['id'] }}">{{ page['title'] }}</a></td>
</tr>
{% endfor %}
</table>
With selected:
<input type=submit value=Delete>
</form>
Run Code Online (Sandbox Code Playgroud)
我有一个函数,当单击"删除"按钮时,应该根据选中的复选框删除页面:
db.session.query(Page).filter(Page.id.in_(page_ids)).delete()
Run Code Online (Sandbox Code Playgroud)
我坚持的是如何遍历所有复选框并形成已page_ids检查的复选框列表.
我无法弄清楚如何使用Jinja2修改包含模板中的块.这是我使用三个文件的示例.
base.html文件:
<html>{% include "content.html" %}</html>
Run Code Online (Sandbox Code Playgroud)
content.html:
<h1>{% block title %}Title{% endblock title%}</h1>
<div>{% block content_body %}Content Body{% endblock content_body%}</div>
Run Code Online (Sandbox Code Playgroud)
story.html
{% extends "base.html" %}
{% block title %}story.title{% endblock title %}
{% block content_body %}story.description{% endblock content_body %}
Run Code Online (Sandbox Code Playgroud)
渲染story.html时,我会得到:
<html>
<h1>Title</h1>
<div>Content Body</div>
</html>
Run Code Online (Sandbox Code Playgroud)
如何使用预期值进行渲染?
我对Jinja和Flask很新
我想在导航栏中设置不同的背景颜色以指示当前页面.
是否有任何内置的Jinja变量或方法返回当前的HTML页面?如果可能,我希望代码不需要与Python文件通信.
所以,如果我现在在index.html,它将返回"index"或"index.html"
这是我模板中的导航代码:
<ul>
{% for item in navigation %}
<a href="{{url_for(item.route)}}">
<li>
{{item.text}}
</li>
</a>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)
我想添加if语句,以便在当前页面会得到<li>有class
{% if ??? %}
<li class="current">
...
</li>
{% else %}
...
{% endif %}
Run Code Online (Sandbox Code Playgroud)
谢谢
我的模板中有以下代码:
data: [{% for deet in deets %} {{ deet.value*100|round(1) }}{% if not loop.last %},{% endif %} {% endfor %}]
Run Code Online (Sandbox Code Playgroud)
我期待数据四舍五入到小数点后1位.但是,当我查看页面或源时,这是我得到的输出:
data: [ 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818, 44.2765833818 ]
Run Code Online (Sandbox Code Playgroud)
这不会四舍五入到小数点后1位.它运行没有模板错误或任何东西,但产生不正确的输出.我对文档的理解,甚至是相关的堆栈溢出问题,都是我的格式应该有效.我错过了什么或做错了什么?
我通过我的python文件将3个列表传递给我的jinja模板.
list1 = [1,2,3,4]
list2 = ['a','b','c','d']
list3 = [5,6,7,8]
Run Code Online (Sandbox Code Playgroud)
所有这些值都是相互对应的,因此1匹配'a'和5,2与'b'和6匹配等.
在我的模板中,我将它们打印在同一行上.如何进行数字索引打印出来?就是这样
1 a 5
2 b 6
3 c 7
Run Code Online (Sandbox Code Playgroud)
我唯一知道的是通过循环直接访问对象
{%for item in list%}
{{item}}
Run Code Online (Sandbox Code Playgroud) 在我的init .py文件中,我有:
app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True
Run Code Online (Sandbox Code Playgroud)
我期望在我的jinja2模板中修剪空白,以便:
<div>
{% if x == 3 %}
<small>{{ x }}</small>
{% endif %}
</div>
Run Code Online (Sandbox Code Playgroud)
将呈现为:
<div>
<small>3</small>
</div>
Run Code Online (Sandbox Code Playgroud)
相反,我得到额外的空格:
<div>
<small>3</small>
</div>
Run Code Online (Sandbox Code Playgroud)
为什么trim_blocks和lstrip_blocks不修剪空白?
获取BashOperator或SqlOperator获取其模板的外部文件的方法有点清楚地记录下来,但是看看PythonOperator我对文档的理解测试不起作用.我不确定templates_exts和templates_dict参数正确交互以获取文件.
在我的DAG文件夹我创建:pyoptemplate.sql和pyoptemplate.t以及test_python_operator_template.py:
SELECT * FROM {{params.table}};
Run Code Online (Sandbox Code Playgroud)
SELECT * FROM {{params.table}};
Run Code Online (Sandbox Code Playgroud)
# coding: utf-8
# vim:ai:si:et:sw=4 ts=4 tw=80
"""
# A Test of Templates in PythonOperator
"""
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
import pprint
pp = pprint.PrettyPrinter(indent=4)
def templated_function(ds, **kwargs):
"""This function will try to use templates loaded from external files"""
pp.pprint(ds)
pp.pprint(kwargs)
# Define …Run Code Online (Sandbox Code Playgroud) 使用ansible进行部署时,我需要删除一个尾随-p子字符串的特定情况.
该字符串somemachine-prod-p应该成为somemachine-prod只有在-p很底.
我看到我可以使用Jinja的子串函数不能满足我的需要,因为我需要去除字符串的结尾,而不是开头.
想法?
我在使用Python生成html文档时遇到了一些问题.我正在尝试创建目录树的HTML列表.这是我到目前为止:
def list_files(startpath):
for root, dirs, files in os.walk(startpath):
level = root.replace(startpath, '').count(os.sep)
if level <= 1:
print('<li>{}<ul>'.format(os.path.basename(root)))
else:
print('<li>{}'.format(os.path.basename(root)))
for f in files:
last_file = len(files)-1
if f == files[last_file]:
print('<li>{}</li></ul>'.format(f))
elif f == files[0] and level-1 > 0:
print('<ul><li>{}</li>'.format(f))
else:
print('<li>{}</li>'.format(f))
print('</li></ul>')
Run Code Online (Sandbox Code Playgroud)
如果只有根目录,一级子目录和文件,它似乎运行良好.但是,添加另一级别的子目录会导致出现问题(因为我认为close标签在结束时输入的次数不够多).但是我很难理解它.
如果不能这样做,有没有更简单的方法呢?我正在使用Flask,但我对模板缺乏经验,所以也许我错过了一些东西.