Python webapp2+;jinja2:如何获取在jinja2视图中工作的uri_for()
如何将特定于pass模型的URL添加到模板中。 比方说,我想建立一个编辑链接。 我想,使用uri_for()函数将是一种简单的方法 但下面给出了“UndefinedError:'webapp2'未定义” 还是应该在主页请求处理程序中准备这些? 如果是这样,我不知道如何将它们添加到每个问候语中 以下代码示例取自: 控制器/处理器Python webapp2+;jinja2:如何获取在jinja2视图中工作的uri_for(),python,google-app-engine,jinja2,webapp2,Python,Google App Engine,Jinja2,Webapp2,如何将特定于pass模型的URL添加到模板中。 比方说,我想建立一个编辑链接。 我想,使用uri_for()函数将是一种简单的方法 但下面给出了“UndefinedError:'webapp2'未定义” 还是应该在主页请求处理程序中准备这些? 如果是这样,我不知道如何将它们添加到每个问候语中 以下代码示例取自: 控制器/处理器 class MainPage(webapp2.RequestHandler): def get(self): guestbook_name=se
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))
模板/视图:
<html>
<body>
{% for greeting in greetings %}
{% if greeting.author %}
<b>{{ greeting.author.nickname }}</b> wrote:
{% else %}
An anonymous person wrote:
{% endif %}
<blockquote>{{ greeting.content|escape }}</blockquote>
{% endfor %}
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
<a href="{{ url }}">{{ url_linktext }}</a>
</body>
</html
:(
必须将的
uri\u设置为全局变量。一种方法是为全局变量和筛选器设置初始值设定项:
import webapp2
from webapp2_extras import jinja2
def jinja2_factory(app):
j = jinja2.Jinja2(app)
j.environment.filters.update({
# Set filters.
# ...
})
j.environment.globals.update({
# Set global variables.
'uri_for': webapp2.uri_for,
# ...
})
return j
class BaseHandler(webapp2.RequestHandler):
@webapp2.cached_property
def jinja2(self):
# Returns a Jinja2 renderer cached in the app registry.
return jinja2.get_jinja2(factory=jinja2_factory)
def render_response(self, _template, **context):
# Renders a template and writes the result to the response.
rv = self.jinja2.render_template(_template, **context)
self.response.write(rv)
编辑:将示例更改为使用RequestHandler。这是更简单的解决方案…-)我有。。。很多人可能已经知道这一点,但效果很好
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(root_path),
extensions=['jinja2.ext.autoescape',
'jinja2.ext.i18n',
CompilerExtension],
variable_start_string='[[',
variable_end_string=']]',
autoescape=True)
env.globals = {
'uri_for': webapp2.uri_for
}
env.globals是键:-)看起来代码示例可能缺少“导入webapp2”。我已经将“导入webapp2”添加到我的控制器/处理程序中,但仍然无法在模板中使用它…非常感谢!我真的很喜欢webapp2。。。我认为我们正在接近解决方案。工厂可以是一个独立的功能。。。不需要属于处理程序。非常感谢-我需要它来让“40; gettext)函数为i18n工作!:-)为了添加扩展,请使用j2.environment.add_extension('my_memcached')为其他无法在模板中使用此扩展的用户添加扩展,您可以这样使用它<代码>{{uri_for(“editGreeting”,greeting.key().id())}
import webapp2
from webapp2_extras import jinja2
class BaseHandler(webapp2.RequestHandler):
def jinja2_factory(app):
j = jinja2.Jinja2(app)
j.environment.filters.update({
# Set filters.
# ...
})
j.environment.globals.update({
# Set global variables.
'uri_for': webapp2.uri_for,
# ...
})
return j
@webapp2.cached_property
def jinja2(self):
# Returns a Jinja2 renderer cached in the app registry.
return jinja2.get_jinja2(factory=self.jinja2_factory)
def render_response(self, _template, **context):
# Renders a template and writes the result to the response.
rv = self.jinja2.render_template(_template, **context)
self.response.write(rv)
import webapp2
from webapp2_extras import jinja2
def jinja2_factory(app):
j = jinja2.Jinja2(app)
j.environment.filters.update({
# Set filters.
# ...
})
j.environment.globals.update({
# Set global variables.
'uri_for': webapp2.uri_for,
# ...
})
return j
class BaseHandler(webapp2.RequestHandler):
@webapp2.cached_property
def jinja2(self):
# Returns a Jinja2 renderer cached in the app registry.
return jinja2.get_jinja2(factory=jinja2_factory)
def render_response(self, _template, **context):
# Renders a template and writes the result to the response.
rv = self.jinja2.render_template(_template, **context)
self.response.write(rv)
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(root_path),
extensions=['jinja2.ext.autoescape',
'jinja2.ext.i18n',
CompilerExtension],
variable_start_string='[[',
variable_end_string=']]',
autoescape=True)
env.globals = {
'uri_for': webapp2.uri_for
}