2015-01-09 3 views
0

Итак, у меня есть ряд объектов, которые я хочу отобразить в цикле. И.Е. Просмотрите каждую из 5 последних сообщений на главной странице. Каждый из этих сообщений будет отображаться по-разному независимо от того, вошел ли пользователь в систему.Rendering Django template from withing template

У меня возник вопрос: как мне это сделать? Я представить себе, что шаблон, как этот

{% if user.is_logged_in %} 
    {% for post in latest_posts %} 
     post.render_long_form 
    {% endfor %} 
{% else %} 
    {% for post in latest_posts %} 
     post.render_short_form 
    {% endfor %} 
{% endif %} 

Как я могу сделать функции render_short_form и render_long_form возвращают соответствующие HTML snippits? Я бы хотел, чтобы они вызывали другие шаблоны для рендеринга под капотом.

Спасибо!

+0

, что внутри этих render_long_for, и т.д.? вы можете включить шаблон в цикл –

+0

Почему бы вам не сделать 2 шаблона и просто проверить 'user.ise_logged_in()' на ваш взгляд? –

ответ

2

Почему бы не использовать {% include %} тег?

{% if user.is_logged_in %} 
    {% for post in latest_posts %} 
     {% include 'long_form.html' %} 
    {% endfor %} 
{% else %} 
    {% for post in latest_posts %} 
     {% include 'short_form.html' %} 
    {% endfor %} 
{% endif %} 

Или, DRY версия:

{% for post in latest_posts %} 
    {% if user.is_logged_in %} 
     {% include 'long_form.html' %} 
    {% else %} 
     {% include 'short_form.html' %} 
    {% endif %} 
{% endfor %} 
+0

А, это звучит правильно. Наверное, я просто искал ключевое слово include. – Peaches491

+0

Как переменная 'post' используется в файле long_form.html? – Peaches491

+0

Все переменные из «родительского» шаблона также доступны в включенном шаблоне. Поэтому просто используйте '{{post}}' как обычно. – catavaran