Django: Передающий аргумент для порождения шаблона

У меня есть шаблоны этого стиля

project
- main_templates (including nav bar)
-- app1
--- app1_base_template
--- app1_templates
-- app2
--- app2_base_template
--- app2_templates

Таким образом, при рендеринге, app2_templates расширяет app2_base_template, который расширяет main_template.

То, что я должен сделать, имеют соответствующий военно-морской объект быть полужирным, когда шаблон app2 представляется (чтобы показать пользователю, где он).

Самое легкое было бы, если я мог бы передать переменную в {блок % xxx %} часть. Действительно ли это возможно?

Что другие универсальные пути там?

24
задан Ciro Santilli 新疆改造中心法轮功六四事件 8 May 2016 в 15:46
поделиться

5 ответов

Вы пробовали использовать тег шаблона {% with%}?

{% block content %}
  {% with 'myvar' as expectedVarName %}
  {{block.super}}
  {% endwith %}
{% endblock content %}
43
ответ дан 28 November 2019 в 22:48
поделиться

Variables from the parent template are automatically included in the child's scope. Your title says you want to pass a variable TO the parent, which doesn't make sense, as you can't define variables in templates. If you need it a variable in the both the parent and the child, just declare it in the view.

2
ответ дан 28 November 2019 в 22:48
поделиться

There's no direct way to pass a variable up the template inheritance tree the way you describe. The way that people implement navigation bars that highlight the current page is often tweaked to the nature of the site itself. That said, I've seen two common approaches:

The low-tech approach

Pass a variable in the template context that indicates which tab is active:

# in views.py
def my_view(request):
    return render_to_response('app2_template.html', {"active_tab": "bar"},

<!-- Parent template -->
<div id="navigation">
    <a href="/foo" {% ifequal active_tab "foo" %}class="active"{% endifequal %}>Foo</a>
    <a href="/bar" {% ifequal active_tab "bar" %}class="active"{% endifequal %}>Bar</a>
</div>

The higher-tech approach

Implement a custom template tag to render your navigation bar. Have the tag take a variable that indicates which section is active:

<!-- Parent template -->

<div id="navigation">{% block mainnav %}{% endblock %}</div>

<!-- any child template -->
{% load my_custom_nav_tag %}
{% block mainnav %}{% my_custom_nav_tag "tab_that_is_active" %}{% endblock %}

You can pretty much go crazy from there. You may find that someone has already implemented something that will work for you on djangosnippets.org.

9
ответ дан 28 November 2019 в 22:48
поделиться

Невозможность передавать аргументы при включении шаблона - один из многих недостатков системы шаблонов Django.

Мне пришлось столкнуться с почти идентичной проблемой: требовались глубоко вложенные шаблоны, чтобы заставить родительские шаблоны отформатируйте / выделите по-другому.

Возможные решения:

  1. Используйте подпрограмму «суперконтекст», которая устанавливает количество значений в зависимости от того, где вы находитесь в иерархии. Т.е. super_context = MySuperContext (запрос, другое, значения и т. Д.), Где super_context - это dict, который вы передаете в представление (или в RequestContext). Это наиболее Django-thnonic (?) Подход, но он означает, что логика представления была перенесена обратно в представления, что мне кажется неправильным.

  2. Используйте тег шаблона expr для установки значений в шаблоны нижнего уровня. Примечание: это работает, только если вы {% include%} шаблон, потому что он должен быть оценен до того, как произойдет включение. Вы не можете сделать это с помощью {% extends%}, потому что это должно быть первым делом в дочернем шаблоне.

  3. Переключитесь на шаблон Jinja2 , по крайней мере, для тех представлений, где это необходимо .

После установки этих значений вы можете делать что-то вроде этого:

<div class="foo{% if foo_active%}_active{%endif%}"> stuff </div>

Это делает класс div «foo», когда он не активен, и «foo_active», когда он активен. Приготовьте по вкусу, но не добавляйте слишком много корицы. : -)

После установки этих значений вы можете делать такие вещи:

<div class="foo{% if foo_active%}_active{%endif%}"> stuff </div>

Это делает класс div «foo», когда он не активен, и «foo_active», когда он активен. Приготовьте по вкусу, но не добавляйте слишком много корицы. : -)

После установки этих значений вы можете делать такие вещи:

<div class="foo{% if foo_active%}_active{%endif%}"> stuff </div>

Это делает класс div «foo», когда он не активен, и «foo_active», когда он активен. Приготовьте по вкусу, но не добавляйте слишком много корицы. : -)

2
ответ дан 28 November 2019 в 22:48
поделиться

К сожалению, я не могу найти чистый способ.

Заканчивается добавлением тега в файл base.html каждого приложения:

<span class="main_nav_bar_hint" id="2"></span>

(На самом деле я использую два. Один установлен базой приложения для основная навигация. Один задается страницами приложения для панели навигации приложения)

И немного магии JQuery в проекте base.html

$(document).ready(function() { $("#nav_menu_" + $(".main_nav_bar_hint").attr("id")).removeClass("normal").addClass("selected"); })

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

1
ответ дан 28 November 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: