2011-08-16 11 views
18

モデル固有のURLをテンプレートに追加するにはどうすればよいですか。 私は編集リンクを構築したいとしましょう。 私は、uri_for()関数を使用すると簡単にアプローチできると思います。webapp2 + jinja2:jinja2-viewsでuri_for()を使用するにはどうすればいいですか?

が、以下は私に「UndefinedError: 『webapp2を』は未定義である」を与える

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

または私はメインページリクエスト・ハンドラでこれらを準備する必要がありますか? もしそうなら、私はそれらを各挨拶に加える方法を知らない。

次のコード例はから取られる: 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)) 

テンプレート/ビュー:

<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が示唆するように私は以下を試しました。

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

そのコード例では、 '輸入webapp2を' に存在しない可能性がありますように見えます:-)キーです。 –

+0

私は既に 'import webapp2'を自分のコントローラ/ハンドラに追加しましたが、それでも私のテンプレートには使用できません... – crushervx

答えて

26

あなたはグローバル変数としてuri_forを設定する必要があり、それを行うための1つの方法は、グローバル変数やフィルタの初期化子を設定することです::。

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を使用するように変更された例

+1

ありがとう!私は本当にwebapp2のように... 私は解決策に近づいていると思います。 – crushervx

+1

私の質問を更新しました... – crushervx

+1

工場はスタンドアロンの機能にすることができます...ハンドラに所属する必要はありません。 – moraes

4

ここに;-)私は...すでに多くの人がこれを知っているかもしれませんが、素晴らしい作品です。

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は

関連する問題