2012-02-12 3 views
1

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

В моих шаблонах я хотел был бы иметь возможность зарегистрировать требования 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 регистрируется, но не «база» один. Как я могу заставить обе работать?

Спасибо!

ответ

3

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

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

+0

Не самый захватывающий способ сделать это ... Но это работает. Благодарю. – Pierre

Смежные вопросы