Как создать собственный шаблонный тег Django, работающий вне блока? - PullRequest
1 голос
/ 12 февраля 2012

В моем проекте мне нужно по-разному относиться к требованиям CSS в зависимости от нескольких параметров. Таким образом, мне нужен дополнительный уровень абстракции по сравнению с доступными статическими системами управления.

В моих шаблонах я хотел бы иметь возможность регистрировать требования CSS (и JS) с помощью тега шаблона, который будет выглядеть как {% register_css 'myfile.css' %}. Этот подход работает как шарм.

Тем не менее, есть еще одна проблема с этим подходом: тег работает отлично при вставке в блок, но никогда не вызывается при вставке поверх дочернего шаблона. Определение тега:

@register.simple_tag(takes_context = True)
def register_css(context, *args):
    context['static_registry'].register_css(streamlet)
    return ''

Это мой тестовый шаблон:

{% extends main_skelton %}
{% load static_registry %}
{% register_css 'base' %}

{% block title %}Welcome{% endblock %}

{% block content %}
{% register_css 'home' %}
<p>Some content here</p>
{% endblock %}

В этом шаблоне регистрируется «домашний» css, но не «базовый». Как я могу заставить оба работать?

Спасибо!

1 Ответ

3 голосов
/ 12 февраля 2012

Включите пустой {% block init %} в базовый шаблон, затем переопределите этот блок в дочерних шаблонах для регистрации файлов - {% block init %}{{ block.super }} {% register_css 'foo %}{% endblock %}

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

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