템플릿 작성

Wagtail은 Django의 템플릿 언어를 사용합니다. Django를 처음 사용하는 개발자는 Django 자체 템플릿 문서를 참조하십시오. Templates

Django/Wagtail을 처음 사용하는 Python 프로그래머는 더 기술적인 문서를 선호할 수 있습니다. The Django template language: for Python programmers

이 문서를 계속하기 전에 Django 템플릿 기본 사항에 익숙해야 합니다.

템플릿

Wagtail의 모든 페이지 유형 또는 “콘텐츠 유형”은 models.py 라는 파일에 “모델”로 정의됩니다. 사이트에 블로그가 있는 경우 BlogPage 모델과 BlogPageListing 이라는 다른 모델이 있을 수 있습니다. 모델 이름은 Django 개발자에게 달려 있습니다.

models.py 의 각 페이지 모델에 대해 Wagtail은 (거의) 동일한 이름의 HTML 템플릿 파일이 존재한다고 가정합니다. 프런트엔드 개발자는 models.py 를 참조하여 정의된 모델에서 템플릿 이름을 추론하여 이러한 템플릿을 직접 만들어야 할 수 있습니다.

적절한 템플릿을 찾기 위해 Wagtail은 CamelCase 이름을 snake_case로 변환합니다. 따라서 BlogPage 모델의 경우 blog_page.html 템플릿이 예상됩니다. 필요한 경우 모델별로 템플릿 파일 이름을 재정의할 수 있습니다.

템플릿 파일은 여기에 존재한다고 가정합니다.

name_of_project/
    name_of_app/
        templates/
            name_of_app/
                blog_page.html
        models.py

자세한 내용은 애플리케이션 디렉터리 템플릿 로더에 대한 Django 문서를 참조하십시오.

페이지 콘텐츠

각 페이지에 입력된 데이터/콘텐츠는 Django의 {{ double-brace }} 표기법을 통해 액세스/출력됩니다. 모델의 각 필드는 page. 를 접두사로 사용하여 액세스해야 합니다. 예를 들어 페이지 제목 {{ page.title }} 또는 작성자 필드 {{ page.author }}.

페이지 모델 wagtail.models.Page.context_object_name 에서 사용자 지정 변수 이름을 구성할 수 있습니다. 사용자 지정 이름이 정의된 경우 page 는 공유 템플릿에서 계속 사용할 수 있습니다.

또한 request. 를 사용할 수 있으며 Django의 요청 객체를 포함합니다.

정적 자산

CSS, JS 및 이미지와 같은 정적 파일은 일반적으로 여기에 저장됩니다.

name_of_project/
    name_of_app/
        static/
            name_of_app/
                css/
                js/
                images/
        models.py

(“css”, “js” 등 이름은 중요하지 않으며, 트리 내에서의 위치만 중요합니다.)

정적 폴더 내의 모든 파일은 {% static %} 태그를 사용하여 HTML에 삽입해야 합니다. 자세한 내용은 정적 파일 (태그)를 참조하십시오.

사용자 이미지

사용자가 Wagtail 사이트에 업로드한 이미지(위에서 언급한 개발자의 정적 파일과 대조적으로)는 이미지 라이브러리로 이동하여 페이지 편집기 인터페이스를 통해 페이지에 추가됩니다.

다른 CMS와 달리 페이지에 이미지를 추가하는 것은 사용할 이미지의 “버전”을 선택하는 것을 포함하지 않습니다. Wagtail에는 미리 정의된 이미지 “형식” 또는 “크기”가 없습니다. 대신 템플릿 개발자는 템플릿 내의 특수 구문을 통해 이미지가 요청될 때 즉석에서 이미지 조작이 발생하도록 정의합니다.

라이브러리의 이미지는 이 구문을 사용하여 요청해야 하지만, 개발자의 정적 이미지는 img 태그와 같은 일반적인 방법을 통해 추가할 수 있습니다. 라이브러리의 이미지만 즉석에서 조작할 수 있습니다.

이미지 조작 구문에 대한 자세한 내용은 여기를 참조하십시오: 템플릿에서 이미지 사용하는 방법.

템플릿 태그 및 필터

Django의 표준 태그 및 필터 외에도 Wagtail은 자체 태그 및 필터를 제공하며, 다른 태그와 마찬가지로 load 할 수 있습니다.

이미지 (태그)

image 태그는 XHTML 호환 img 요소를 페이지에 삽입하고 src, width, height, alt 를 설정합니다. img 태그에 대한 더 많은 제어도 참조하십시오.

image 태그의 구문은 다음과 같습니다.

{% image [image] [resize-rule] %}

예를 들어:

{% load wagtailimages_tags %}
...

{% image page.photo width-400 %}

<!-- 또는 정사각형 썸네일: -->
{% image page.photo fill-80x80 %}

전체 문서는 템플릿에서 이미지 사용하는 방법를 참조하십시오.

여러 형식의 이미지

picture 태그는 image 처럼 작동하지만, 여러 형식을 지정하여 <picture> 요소와 <source> 요소 및 대체 <img> 를 생성할 수 있습니다.

예를 들어:

{% load wagtailimages_tags %}
...

{% picture page.photo format-{avif,webp,jpeg} width-400 %}

전체 문서는 여러 형식를 참조하십시오.

여러 크기의 이미지

srcset_image 태그는 image 처럼 작동하지만, 여러 크기를 지정하여 srcset 속성을 생성하고 반응형 이미지 규칙을 활용할 수 있습니다.

예를 들어:

{% load wagtailimages_tags %}
...

{% srcset_image page.photo width-{400,800} sizes="(max-width: 600px) 400px, 80vw" %}

picture 를 사용하여 여러 형식과 크기를 동시에 생성할 수도 있습니다.

{% picture page.photo format-{avif,webp,jpeg} width-{400,800} sizes="80vw" %}

전체 문서는 반응형 이미지를 참조하십시오.

리치 텍스트 (필터)

richtext 필터는 HTML 콘텐츠 조각을 받아 페이지에 안전한 HTML로 렌더링합니다. 중요하게도, Wagtail 편집기에서 만들어진 포함된 이미지 및 링크에 대한 내부 약식 참조를 완전히 완성된 HTML로 확장하여 표시할 준비가 되도록 합니다.

RichTextField 를 사용하는 필드만 템플릿에 적용해야 합니다.

{% load wagtailcore_tags %}
...
{{ page.body|richtext }}

반응형 임베드

Wagtail은 템플릿에 자체 스타일을 적용하지 않으므로 이미지 및 포함된 미디어는 HTML에 의해 결정된 고정 너비로 표시됩니다. 이미지는 다음과 같은 CSS 규칙을 사용하여 컨테이너에 맞게 크기를 조정할 수 있습니다.

.body img {
    max-width: 100%;
    height: auto;
}

여기서 body 는 템플릿에서 이미지를 둘러싸는 컨테이너 요소입니다.

포함된 미디어를 크기 조정 가능하게 만드는 것도 가능하지만, 일반적으로 미디어의 가로 세로 비율과 일치하는 사용자 지정 스타일 규칙이 필요합니다. 이를 돕기 위해 Wagtail은 반응형 임베드에 대한 내장 지원을 제공하며, 프로젝트 설정에서 WAGTAILEMBEDS_RESPONSIVE_HTML = True 로 설정하여 활성화할 수 있습니다. 이렇게 하면 임베드에 responsive-object CSS 클래스와 인라인 padding-bottom 스타일이 추가되어 다음 CSS와 함께 사용됩니다.

.responsive-object {
    position: relative;
}

.responsive-object iframe,
.responsive-object object,
.responsive-object embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

내부 링크 (태그)

pageurl

페이지 객체를 받아 현재 페이지와 동일한 사이트에 있는 경우 상대 URL(/foo/bar/)을 반환하고, 그렇지 않은 경우 절대 URL(http://example.com/foo/bar/)을 반환합니다.

{% load wagtailcore_tags %}
...
<a href="{% pageurl page.get_parent %}">색인으로 돌아가기</a>

fallback 키워드 인수를 제공할 수 있습니다. 이는 URL 문자열, 매개변수 없이 해결할 수 있는 명명된 URL 경로 또는 get_absolute_url 메서드가 있는 객체일 수 있으며, 전달된 페이지가 None 일 때 대체 URL로 사용됩니다.

{% load wagtailcore_tags %}

{% for publication in page.related_publications.all %}
    <li>
        <a href="{% pageurl publication.detail_page fallback='coming_soon' %}">
            {{ publication.title }}
        </a>
    </li>
{% endfor %}

fullpageurl

페이지 객체를 받아 절대 URL(http://example.com/foo/bar/)을 반환합니다.

{% load wagtailcore_tags %}
...
<meta property="og:url" content="{% fullpageurl page %}" />

pageurl 과 마찬가지로 fallback 키워드 인수를 제공할 수 있습니다.

slugurl

페이지의 “홍보” 탭에 정의된 slug 를 받아 일치하는 페이지의 URL을 반환합니다. 동일한 슬러그를 가진 여러 페이지가 있는 경우 선택되는 페이지는 결정되지 않습니다.

pageurl 과 마찬가지로 가능한 경우 상대 링크를 제공하려고 시도하지만, 페이지가 다른 사이트에 있는 경우 절대 링크로 기본 설정됩니다. 이는 최상위 탐색 또는 사이트 전체 링크와 같은 공유 페이지 요소를 만들 때 가장 유용합니다.

{% load wagtailcore_tags %}
...
<a href="{% slugurl 'news' %}">뉴스 색인</a>

정적 파일 (태그)

static 태그는 정적 파일 디렉터리에서 모든 것을 로드하는 데 사용됩니다. 이 태그를 사용하면 호스팅 배열이 변경될 때(예: 개발에서 라이브 환경으로 이동할 때) 모든 정적 경로를 다시 작성하는 것을 피할 수 있습니다.

{% load static %}
...
<img src="{% static "name_of_app/myimage.jpg" %}" alt="내 이미지"/>

전체 경로가 필요하지 않다는 점에 유의하십시오. 여기에 주어진 경로는 앱의 static 디렉터리에 대한 상대 경로입니다. 다른 앱(Wagtail 자체 포함)의 정적 파일과의 충돌을 피하려면 정적 파일을 앱과 동일한 이름의 static 하위 디렉터리에 배치하는 것이 좋습니다.

다중 사이트 지원

wagtail_site

현재 요청에 해당하는 Site 객체를 반환합니다.

{% load wagtailcore_tags %}

{% wagtail_site as current_site %}

Wagtail 사용자 바

wagtailuserbar 태그는 로그인한 사용자를 위한 상황별 플라이아웃 메뉴를 제공합니다. 이 메뉴는 편집자에게 현재 페이지를 편집하거나 자식 페이지를 추가하는 기능 외에 Wagtail 페이지 탐색기에서 페이지를 표시하거나 Wagtail 관리 대시보드로 이동하는 옵션을 제공합니다. 중재자는 콘텐츠 중재의 일부로 미리 보는 페이지를 수락하거나 거부하는 기능도 제공됩니다.

이 태그는 페이지 객체 없이 표준 Django 뷰에서 사용할 수 있습니다. 사용자 바에는 관리자를 가리키는 항목이 하나 포함됩니다.

키보드 사용자가 액세스할 수 있도록 <body> 요소 상단 근처에 태그를 배치하는 것이 좋습니다. 건너뛰기 링크 뒤에, 그러나 탐색 및 페이지의 주요 콘텐츠 앞에 태그를 배치하는 것을 고려해야 합니다.

{% load wagtailuserbar %}
...
<body>
    <a id="#content">콘텐츠로 건너뛰기</a>
    {% wagtailuserbar %} {# 여기가 사용자 바에 좋은 위치입니다. #}
    <nav>
    ...
    </nav>
    <main id="content">
    ...
    </main>
</body>

기본적으로 사용자 바는 브라우저 창의 오른쪽 하단에 가장자리에서 안쪽으로 들여쓰기되어 나타납니다. 디자인과 충돌하는 경우 템플릿 태그에 매개변수를 전달하여 이동할 수 있습니다. 다음 예시는 화면의 각 모서리에 사용자 바를 배치하는 방법을 보여줍니다.

...
{% wagtailuserbar 'top-left' %}
{% wagtailuserbar 'top-right' %}
{% wagtailuserbar 'bottom-left' %}
{% wagtailuserbar 'bottom-right' %}
...

사용자 바는 디자인에 가장 적합한 위치에 배치할 수 있습니다. 또는 자체 CSS 파일에서 CSS 규칙으로 배치할 수 있습니다. 예를 들어:

wagtail-userbar::part(userbar) {
    bottom: 30px;
}

사용자 바에 표시되는 항목을 사용자 지정하려면 construct_wagtail_userbar 훅을 사용할 수 있습니다.

미리 보기와 라이브 간 출력 변경

때로는 페이지가 미리 보기 중인지 또는 라이브로 보고 있는지에 따라 템플릿 출력을 변경하고 싶을 수 있습니다. 예를 들어, 사이트에 Google Analytics와 같은 방문자 추적 코드가 있는 경우 미리 볼 때 이를 제외하는 것이 좋습니다. 이렇게 하면 편집기 활동이 분석 보고서에 나타나지 않습니다. Wagtail은 미리 보기와 라이브를 구분하기 위해 request.is_preview 변수를 제공합니다.

{% if not request.is_preview %}
    <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        ...
    </script>
{% endif %}

페이지가 미리 보기 중인 경우 request.preview_mode 를 사용하여 사용 중인 특정 미리 보기 모드를 확인할 수 있습니다. 페이지가 여러 미리 보기 모드를 지원하는 경우.

템플릿 조각 캐싱

Django는 템플릿의 일부를 캐싱할 수 있는 템플릿 조각 캐싱을 지원합니다. Wagtail에서 Django의 {% cache %} 태그를 기본적으로 사용하는 것은 위험할 수 있습니다. 최종 사용자에게 미리 보기 콘텐츠가 표시될 수 있기 때문입니다. 대신 Wagtail은 wagtail_cache 에서 로드할 수 있는 2개의 추가 템플릿 태그를 제공합니다.

미리 보기 인식 캐싱

{% wagtailcache %} 태그는 Django의 {% cache %} 태그와 유사하게 작동하지만, Wagtail에서 페이지(또는 다른 모델)를 미리 볼 때 캐시된 콘텐츠를 캐시하거나 제공하지 않습니다.

{% load wagtail_cache %}

{% wagtailcache 500 sidebar %}
    <!-- 사이드바 -->
{% endwagtailcache %}

{% cache %} 와 마찬가지로 make_template_fragment_key를 사용하여 캐시 키를 얻을 수 있습니다.

페이지 인식 캐싱

{% wagtailpagecache %}{% wagtailcache %} 의 확장으로, 현재 pagesite 를 인식하고 캐시 키의 일부로 포함합니다. 이를 통해 페이지의 일부에 캐싱을 쉽게 추가할 수 있으며, 페이지가 어디에 있는지 걱정할 필요가 없습니다. {% wagtailpagecache %} 는 의도적으로 가정을 합니다. 더 많은 사용자 지정을 위해서는 {% wagtailcache %} 를 사용하는 것이 좋습니다.

{% load wagtail_cache %}

{% wagtailpagecache 500 hero %}
    <!-- 히어로 -->
{% endwagtailpagecache %}

이는 다음과 동일합니다.

{% wagtail_site as current_site %}

{% wagtailcache 500 hero page.cache_key current_site.id %}
    <!-- 히어로 -->
{% endwagtailcache %}

페이지의 캐시 키를 사용하면 페이지가 업데이트될 때 캐시가 자동으로 무효화됩니다.

캐시 키를 얻으려면 make_wagtail_template_fragment_key 를 사용할 수 있습니다(Django의 make_template_fragment_key 기반).

from django.core.cache import cache
from wagtail.coreutils import make_wagtail_template_fragment_key

key = make_wagtail_template_fragment_key("hero", page, site)
cache.delete(key)  # 캐시된 템플릿 조각 무효화