2014-12-23 4 views
3

Я работаю над своим сайтом с шаблонами Flask и Jinja, и у меня есть странная ошибка в отношении включения изображений в шаблоны. У меня есть шаблон post.html, который наследуется от base.html, и ему передается объект post из базы данных SQL. Проблема в том, что некоторые функции шаблонов Jinja не вызываются, когда я это делаю, а именно теги HTML-изображения неправильно загружаются на основе вызова url_for(). Регулярные HTML-теги хороши, так как я использую |safe, чтобы заставить их обрабатываться.Функции флагов вызова внутри шаблонов

Пример из post.html шаблона:

{% extends "base.html" %} 
{% block content %} 
<div class="post-description"> 
     <p> 
      {{post.body|safe}}  
     </p> 
</div> 
{% endblock %} 

Пример из этого post.body вызова:

<b> I work, and am bolded</b> 
<img src="{{ url_for('static', filename = 'images/randomImg.png') }}"> 

Хотя жирный текст показывает вверх штраф, url_for никогда не вызывается. В исходном источнике (на самом веб-сайте) это легко проверить, поскольку ссылка src никогда не представляется должным образом, в отличие от других страниц, на которых функция оценивается. Если скопировать/вставить <img> линию, так что теперь мой post.html выглядит следующим образом:

{% extends "base.html" %} 
{% block content %} 
<div class="post-description"> 
     <p> 
      <img src="{{ url_for('static', filename = 'images/randomImg.png') }}"> 
      {{post.body|safe}}  
     </p> 
</div> 
{% endblock %} 

Первые нагрузки вызовов изображение мелких, но тот, что внутри post.body нет. Я не уверен, есть ли способ Flask или Jinja заставить его оценить его, но я надеюсь на это.

Редактировать Решение: Хитрость в том, чтобы оказать первую post.body внутри вызова render_template_string, так как это будет правильно «заполнить» на url_for вызовы, так что render_template может затем оценить должным образом.

ответ

1

post.body не был обработан так, как вы этого хотите, потому что jinja2 не пытается восстановить свой собственный вывод по умолчанию, что имеет смысл.

Вы могли бы оказать пост тела, а затем вынести ответ:

@app.route("/some/path") 
def some_view(): 
    # ... 
    post = Post.query.first() 
    rendered_post_body = render_template_string(post.body) 
    return render_template("some_template.html", post_body=rendered_post_body) 
+0

Я попробовал ваше первое решение, но я не смог получить функцию под названием до сих пор. Я быстро создал файл «blank.html», который содержит только '{{data | сейф}} '. Затем я дважды вызываю «render_template»: «render_template ('blank.html', data = render_template ('blank.html', data = post.body))' без изменений, к сожалению –

+0

Вы имеете в виду, что 'rendered_post_body' не содержать оцененный 'url_for'? Если да, можете ли вы напечатать 'post.body' и' rendered_post_body' внутри ** view ** и предоставить вывод? –

+1

Вам нужно ['render_template_string'] (http://flask.pocoo.org/docs/0.10/api/#flask.render_template_string) не' render_template' для создания 'rendered_post_body'. Помните, что первым аргументом 'render_template' считается путь к шаблону. –

Смежные вопросы