Включить представление в шаблон - PullRequest
9 голосов
/ 04 мая 2011

В django у меня есть представление, которое заполняет html-файл шаблона, но внутри html-шаблона я хочу включить другое представление, использующее другой html-шаблон, например так:

{% block content %}
Hey {{stuff}} {{stuff2}}!

{{ view.that_other_function }}

{% endblock content %}

Возможно ли это?

Ответы [ 3 ]

6 голосов
/ 04 мая 2011

Да, для этого вам нужно использовать тег шаблона.Если все, что вам нужно сделать, это визуализировать другой шаблон, вы можете использовать тег включения или, возможно, просто встроенный {% include 'path / to / template.html'%}

Теги шаблона могут делать все, что угодно.можно сделать в Python.

http://docs.djangoproject.com/en/1.3/howto/custom-template-tags/

[Followup] Вы можете использовать метод render_to_string:

from django.template.loader import render_to_string
content = render_to_string(template_name, dictionary, context_instance)

Вам нужно будет либо разрешить объект запроса изконтекст или передать его в качестве аргумента тегу шаблона, если вам нужно использовать context_instance.

Followup Answer: пример тега включения

Django ожидает, что теги шаблона будут жить в папке с именем'templatetags', который находится в модуле приложения в ваших установленных приложениях ...

/my_project/
    /my_app/
        __init__.py
        /templatetags/
            __init__.py
            my_tags.py

#my_tags.py
from django import template

register = template.Library()

@register.inclusion_tag('other_template.html')
def say_hello(takes_context=True):
    return {'name' : 'John'}

#other_template.html
{% if request.user.is_anonymous %}
{# Our inclusion tag accepts a context, which gives us access to the request #}
    <p>Hello, Guest.</p>
{% else %}
    <p>Hello, {{ name }}.</p>
{% endif %}

#main_template.html
{% load my_tags %}
<p>Blah, blah, blah {% say_hello %}</p>

Тег включения отображает другой шаблон, как вам нужно, но без необходимости вызова функции просмотра.Надеюсь, это поможет вам.Документы на теги включения находятся по адресу: http://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#inclusion-tags

3 голосов
/ 04 мая 2011

Используя ваш пример и ваш ответ на ответ Брэндона, это должно сработать для вас:

template.html

{% block content %}
Hey {{stuff}} {{stuff2}}!

{{ other_content }}

{% endblock content %}

views.py

from django.http import HttpResponse
from django.template import Context, loader
from django.template.loader import render_to_string


def somepage(request): 
    other_content = render_to_string("templates/template1.html", {"name":"John Doe"})
    t = loader.get_template('templates/template.html')
    c = Context({
        'stuff': 'you',
        'stuff2': 'the rocksteady crew',
        'other_content': other_content,
    })
    return HttpResponse(t.render(c))
1 голос
/ 20 ноября 2013

Кто-то создал шаблонный тег, который загружает представление .Я попробовал, и это работает.Преимущество использования этого тега шаблона заключается в том, что вам не нужно переписывать существующие представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...