Как повторить «блок» в шаблоне Django - PullRequest
121 голосов
/ 04 февраля 2009

Я хочу использовать один и тот же {% block%} дважды в одном и том же шаблоне django. Я хочу, чтобы этот блок появлялся в моем базовом шаблоне более одного раза:

# base.html
<html>
    <head>
        <title>{% block title %}My Cool Website{% endblock %}</title>
    </head>
    <body>
        <h1>{% block title %}My Cool Website{% endblock %}</h1>
    </body>
</html>

А затем расширить его:

# blog.html
{% extends 'base.html' %}
{% block title %}My Blog{% endblock %}

# pictures.html
{% extends 'base.html' %}
{% block title %}My Pictures{% endblock %}

# cats.html
{% extends 'base.html' %}
{% block title %}My Cats{% endblock %}

Я получу исключение, так как Django хочет, чтобы блок появлялся только один раз:

TemplateSyntaxError at /

появляется тег 'block' с именем 'title' более одного раза

Быстрое и грязное решение будет дублировать блок title в title1 и title2 :

# blog.html
{% extends 'base.html' %}
{% block title1 %}My Blog{% endblock %}
{% block title2 %}My Blog{% endblock %}

Но это нарушение принципа DRY . Это было бы очень сложно, так как у меня много наследующих шаблонов, а также потому, что я не хочу идти в ад; -)

Есть ли уловка или обходной путь для этой проблемы? Как я могу повторить тот же блок в моем шаблоне, не дублируя весь код?

Ответы [ 13 ]

1 голос
/ 20 января 2017

Я использую этот ответ , чтобы держать вещи сухими.

{% extends "base.html" %}

{% with "Entry Title" as title %}
    {% block title %}{{ title }}{% endblock %}
    {% block h1 %}{{ title }}{% endblock %}
{% endwith %}
1 голос
/ 04 февраля 2009

Для этого есть два простых решения.

Самый простой - поместить заголовок в переменную контекста. Вы бы установили переменную контекста в вашем представлении.

Если вы используете что-то вроде общих представлений и не имеете views.py для изображений, кошек и т. Д., Вы можете пойти по пути пользовательского тега шаблона, который устанавливает переменную в контексте .

Пройдя по этому маршруту, вы сможете сделать что-то вроде:

{% extends "base.html" %}
{% load set_page_title %}
{% page_title "My Pictures" %}
...

Тогда в вашем base.html:

...
{% block title %}{{ page_title }}{% endblock %}
...
<h1>{{ page_title }}</h1>
0 голосов
/ 01 сентября 2011

В веточку вы можете сделать это так:

# base.html
<html>
    <head>
        <title>{{ block('title') }}</title>
    </head>
    <body>
        <h1>{{ block('title') }}</h1>
    </body>
</html>

# blog.html
{% extends 'base.html' %}
{% block title %}My Blog{% endblock %}

# pictures.html
{% extends 'base.html' %}
{% block title %}My Pictures{% endblock %}

# cats.html
{% extends 'base.html' %}
{% block title %}My Cats{% endblock %}
...