[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

이름이 ‘title’인 ‘block’태그가 두 번 이상 나타납니다.

빠르고 더러운 해결책은 블록 제목title1title2 로 복제하는 것입니다 .

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

그러나 이것은 DRY 원칙을 위반하는 것입니다. 상속 템플릿이 많고 지옥에 가고 싶지 않기 때문에 매우 어려울 것입니다. 😉

이 문제에 대한 트릭이나 해결 방법이 있습니까? 모든 코드를 복제하지 않고 템플릿에서 동일한 블록을 어떻게 반복 할 수 있습니까?



답변

이 경우 컨텍스트 프로세서를 사용하는 것이 과도하다고 생각합니다. 당신은 이것을 쉽게 할 수 있습니다 :

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

그리고:

# blog.html
{% extends 'base.html' %}
{% block content %}
    <h1>{% block title %}My Blog{% endblock %}</h1>
    Lorem ipsum here...
{% endblock %}

등등 … DRY- 호환되는 것처럼 보입니다.


답변

Django 템플릿 매크로 플러그인을 사용하십시오.

https://gist.github.com/1715202 (django> = 1.4)

또는

http://www.djangosnippets.org/snippets/363/ (django <1.4)

장고> = 1.4

# base.html
{% kwacro title %}
    {% block title %}My Cool Website{% endblock %}
{% endkwacro %}

<html>
    <head>
        <title>{% usekwacro title %}</title>
    </head>
    <body>
        <h1>{% usekwacro title %}</h1>
    </body>
</html>

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

장고 <1.4

# base.html
{% macro title %}
    {% block title %}My Cool Website{% endblock %}
{% endmacro %}

<html>
    <head>
        <title>{% usemacro title %}</title>
    </head>
    <body>
        <h1>{% usemacro title %}</h1>
    </body>
</html>

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


답변

실제로 블록을 사용하고 싶지 않고 변수를 사용하고 싶을 것입니다.

# base.html
<html>
    <head>
        <title>{{ title|default:"My Cool Website" }}</title>
    </head>
    <body>
        <h1>{{ title|default:"My Cool Website" }}</h1>
    </body>
</html>

그런 다음 컨텍스트를 통해 제목을 설정하십시오.


답변

내가 똑같은 일을 할 때 내가 발견 한 방법은 다음과 같습니다.

# base_helper.html
<html>
    <head>
        <title>{% block _title1 %}{% endblock %}</title>
    </head>
    <body>
        <h1>{% block _title2 %}{% endblock %}</h1>
    </body>
</html>


# base.html
{% extends "base_helper.html" %}

# Copy title into _title1 & _title2, using "My Cool Website" as a default.
{% block _title1 %}{% block _title2 %}{% block title %}My Cool Website{% endblock %}{% endblock %}{% endblock %}

불행히도 추가 파일이 필요하지만보기에서 제목을 전달할 필요는 없습니다.


답변

{% include subtemplate.html %}두 번 이상 사용할 수 있습니다 . 블록과 같지는 않지만 트릭을 수행합니다.


답변

논의는 여기에 있습니다 :
http://code.djangoproject.com/ticket/4529을
분명히 그들은 이것이 일반적인 사용 시나리오 아니라고 생각하기 때문에 핵심 팀이 티켓을 거부 장고, 그러나 나는 동의하지 않는다.

반복 블록은 다음과 같이 간단하고 깔끔하게 구현됩니다.
https://github.com/SmileyChris/django-repeatblock

템플릿 매크로는 또 하나이지만 저자는 신중하게 테스트하지 않았다고 언급했습니다.
http://www.djangosnippets.org/snippets/363/

반복 블록을 사용했습니다.


답변

장고 – 매크로,이 건너 오는 사람에 대한 업데이 트로서, 내가 위에서 언급 한 조각을 찍은 및 템플릿 태그 라이브러리로 설정되어, 매크로가 더 강력하게하고 명시 적으로 반복 블록 패턴을 구현 장고 – 매크로 .