Динамический выбор шаблона для тега включения Django - PullRequest
9 голосов
/ 15 октября 2010

В настоящее время

У меня есть тег включения, который закодирован примерно так:

@register.inclusion_tag('forms/my_insert.html', takes_context=True)
def my_insert(context):
    # set up some other variables for the context
    return context

В моем шаблоне я включаю его, вставляя {% my_insert %}

Запрос новой функции

Теперь мы хотим протестировать новый макет - это просто изменение шаблона, без изменений контекстных переменных.Я выполняю это, вызывая первый

@register.inclusion_tag('forms/my_new_insert.html', takes_context=True)
def my_new_insert(context):
    return my_insert(context)

Чтобы использовать новый шаблон, я должен использовать:

{% ifequal some_var 0 %}
    {% my_insert %}
{% endifequal %}
{% ifnotequal some_var 0 %}
    {% my_new_insert %}
{% endifnotequal %}

Вопрос

Есть ли способ выбрать шаблон в функции, которая устанавливает контекст тега шаблона?

I представьте это может быть что-то вроде:

@register.inclusion_tag('forms/my_insert.html', takes_context=True)
def my_insert(context):
    # set up some other variables for the context
    if context['some_var'] == 0:
        context['template'] = 'forms/my_insert.html'
    else:
        context['template'] = 'forms/my_new_insert.html'
    return context

Ответы [ 3 ]

3 голосов
/ 18 мая 2015

Мне пришлось решить ту же проблему, описанную выше, и я решил ее следующим образом:

dummy.html

{% extends template %}

mytags.py

from django.template import Library

register = Library()

@register.inclusion_tag('dummy.html')
def render_sample(template='default.html'):
    return {'template': template}

layout.html

{% load mytags %}

{% render_sample template="another_template.html"
1 голос
/ 15 октября 2010

Вам нужно создать свой собственный тег с параметром, который будет вашим шаблоном. Где нельзя использовать тег включения с несколькими шаблонами.

0 голосов
/ 29 ноября 2012

Попробуйте:

@register.inclusion_tag('include/dummy.html')
def my_new_insert(template='forms/my_insert.html'):
    return {'template': template,
            'myvar': Myobject.objects.all()}

и посмотрите документацию на django

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