首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >webapp2 + jinja2:如何让uri_for()在jja2-views中工作?

webapp2 + jinja2:如何让uri_for()在jja2-views中工作?
EN

Stack Overflow用户
提问于 2011-08-17 00:05:46
回答 2查看 6.4K关注 0票数 18

如何将传递模型特定的urls添加到模板。比方说,我想构建一个编辑链接。我猜,使用uri_for()函数将是一种简单的方法。

但是下面的代码给了我"UndefinedError:'webapp2‘is undefined“

代码语言:javascript
复制
{% webapp2.uri_for("editGreeting", greeting.key().id()) %}

或者我应该在MainPage-Request-Handler中准备这些?如果是这样,我不知道如何将它们添加到每个问候语中。

以下代码示例摘自:http://webapp-improved.appspot.com/tutorials/gettingstarted/templates.html

控制器/处理程序

代码语言:javascript
复制
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))

模板/视图:

代码语言:javascript
复制
<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

类BaseHandler是所有处理程序继承的类。我按照@moraes的建议尝试了以下方法。我还是得到了:

代码语言:javascript
复制
value = self.func(obj)
File "C:\Users\timme04\python\hellowebapp\handlers\basehandler.py", line 23, in jinja2
return jinja2.get_jinja2(factory=self.jinja2_factory)
File "C:\Users\timme04\python\hellowebapp\webapp2_extras\jinja2.py", line 212, in get_jinja2
jinja2 = app.registry[key] = factory(app)
TypeError: jinja2_factory() takes exactly 1 argument (2 given)

:(

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-17 00:37:03

必须将uri_for设置为全局变量。一种方法是为全局变量和过滤器设置初始化器:

代码语言:javascript
复制
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。

票数 26
EN

Stack Overflow用户

发布于 2014-03-19 00:10:15

这里有一个更简单的解决方案..;-)我有...许多人可能已经知道这一点,但效果很好。

代码语言:javascript
复制
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是关键:-)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7081250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档