동일한 장고 템플릿에서 동일한 {% 블록 %}을 (를) 두 번 사용하고 싶습니다 . 이 블록이 기본 템플릿에 두 번 이상 나타나기를 원합니다.
# 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’태그가 두 번 이상 나타납니다.
빠르고 더러운 해결책은 블록 제목 을 title1 과 title2 로 복제하는 것입니다 .
# 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/
반복 블록을 사용했습니다.
답변
장고 – 매크로,이 건너 오는 사람에 대한 업데이 트로서, 내가 위에서 언급 한 조각을 찍은 및 템플릿 태그 라이브러리로 설정되어, 매크로가 더 강력하게하고 명시 적으로 반복 블록 패턴을 구현 장고 – 매크로 .