Как я могу добавить URL-адреса, специфичные для модели, в шаблон. Скажем, я хочу создать ссылку для редактирования. Я предполагаю, что использование функции uri_for () было бы простым подходом.
Но следующее дает мне «UndefinedError: 'webapp2' is undefined»
{% webapp2.uri_for("editGreeting", greeting.key().id()) %}
Или мне следует подготовить их в 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))
Шаблон / представление:
{% for greeting in greetings %}
{% if greeting.author %}
{{ greeting.author.nickname }} wrote:
{% else %}
An anonymous person wrote:
{% endif %}
{{ greeting.content|escape }}
{% endfor %}
{{ url_linktext }}
Класс 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)