webapp2 + jinja2:我如何获得uri_for()在jinja2-views中工作 [英] webapp2 + jinja2: How can i get uri_for() working in jinja2-views

查看:164
本文介绍了webapp2 + jinja2:我如何获得uri_for()在jinja2-views中工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何添加通过模型特定的网址到模板。
比方说,我想建立一个编辑链接。
我猜,使用uri_for()函数将是一个简单的方法。



但是下面给出了UndefinedError:'webapp2'未定义 / p>

  {%webapp2.uri_for(editGreeting,greeting.key()。id())%} 

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



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



控制器/处理程序

  class MainPage(webapp2.RequestHandler):
)get 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)

如果users.get_current_user():
url = users.create_logout_url(self.request.uri)
url_linktext ='注销'
其他:
url = users.create_login_url(self.request.uri)
url_linktext ='登录'

template_values = {
'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>写道:
{%else%}
一位匿名人士写道:
{%endif%}
< blockquote> {{greeting.content | escape}}< / blockquote> ;
{%endfor%}

< form action =/ signmethod =post>
< div>< textarea name =contentrows =3cols =60>< / textarea>< / div>
< div>< input type =submitvalue =Sign Guestbook>< / div>
< / form>

< a href ={{url}}> {{url_linktext}}< / a>
< / body>

BaseHandler类是继承自所有处理程序的类。
我尝试了@moraes建议的以下内容。
我仍​​然可以得到:

$ p $ value = self.func(obj)
文件C:\ Users \timme04\python\hellowebapp\handlers\basehandler.py,第23行,在jinja2
中返回jinja2.get_jinja2(factory = self.jinja2_factory)
文件C:\用户\timme04\python\hellowebapp\webapp2_extras\jinja2.py,第212行,在get_jinja2
jinja2 = app.registry [key] = factory(app)
TypeError:jinja2_factory )只需要1个参数(给出2个)

:(b / b)

 从webapp2_extras导入webapp2 
$ b $导入jinja2

class BaseHandler(webapp2.RequestHandler):

def jinja2_factory(app):
j = jinja2.Jinja2(app)
j.environment.filters.update({
#设置过滤器
#...
$)
j.environment.globals.update({
#设置全局变量
'uri_for':webapp2.uri_for,
#...
})
返回j

@ webapp2.cached_property
def jinja2(self):
#返回一个Jinja2渲染器,缓存在应用注册表。
return jinja2.get_jinja2(factory = self.jinja2_factory)
$ b $ def def render_response(self,_template,** context):
#渲染模板并将结果写入响应。
rv = self.jinja2.render_template(_template,** context)
self.response.write(rv)


解决方案

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

 从webapp2_extras导入webapp2 
import jinja2

def jinja2_factory(app):
j = jinja2.Jinja2(app)
j.environment.filters.update({
#设置过滤器
#...
})
j.environment.globals.update({
#设置全局变量。
'uri_for':webapp2.uri_for,
#。 ..
})
返回j

class BaseHandler(webapp2.RequestHandler):

@ webapp2.cached_property
def jinja2(self ):
#返回缓存在应用程序注册表中的Jinja2渲染器。
return jinja2.get_jinja2(factory = jinja2_factory)
$ b $ def def render_response(self,_template,** context):
#渲染模板并将结果写入响应。
rv = self.jinja2.render_template(_template,** context)
self.response.write(rv)

编辑:更改示例以使用RequestHandler。


How can i add pass Model-Specific urls to the Template. Let's say, i want to build an edit-link. I would guess, using the uri_for() function would be an easy approach.

But the following gives me "UndefinedError: 'webapp2' is undefined"

{% webapp2.uri_for("editGreeting", greeting.key().id()) %}

Or should i prepare these in the MainPage-Request-Handler? If so, i don't know how to add them to each greeting.

The following Code-Example is taken from: http://webapp-improved.appspot.com/tutorials/gettingstarted/templates.html

Controller/Handler

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))

Template/View:

<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

The class BaseHandler is the class all handlers inherit from. I tried the following as @moraes suggested. I still get:

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)

:(

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)

解决方案

You must set uri_for as a global variable. One way to do it is to set an initializer for global variables and filters:

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)

Edit: changed example to use a RequestHandler.

这篇关于webapp2 + jinja2:我如何获得uri_for()在jinja2-views中工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆