로드 시 Wagtail은 wagtail_hooks.py 파일이 있는 모든 앱을 검색하고 내용을 실행합니다. 이는 페이지가 저장될 때 또는 주 메뉴가 구성될 때와 같이 Wagtail 실행의 특정 지점에서 실행될 자체 함수를 등록하는 방법을 제공합니다.

참고

훅은 일반적으로 Wagtail 관리자 및 프런트엔드의 뷰 수준 동작을 사용자 지정하는 데 사용됩니다. 모델 수준 동작만 다루는 사용자 지정의 경우(예: 페이지 또는 문서가 추가될 때 외부 서비스를 호출하는 경우) Django의 신호 메커니즘(참조: Wagtail 신호)을 사용하는 것이 더 좋습니다. 이는 사용자가 관리자 인터페이스를 통해 특정 경로를 따르는 것에 의존하지 않기 때문입니다.

Wagtail 훅에 함수를 등록하는 것은 @hooks.register 데코레이터를 통해 수행됩니다.

from wagtail import hooks

@hooks.register('name_of_hook')
def my_hook_function(arg1, arg2...)
    # 여기에 코드

또는 hooks.register 는 훅 이름과 다른 곳에 정의된 핸들러 함수를 전달하여 일반 함수로 호출할 수 있습니다.

hooks.register('name_of_hook', my_hook_function)

훅이 특정 순서로 실행되도록 하려면 order 매개변수를 전달할 수 있습니다. 순서가 지정되지 않으면 훅은 INSTALLED_APPS 에 지정된 순서로 진행됩니다. Wagtail도 내부적으로 훅을 사용하므로 내장 Wagtail 기능을 재정의할 때(예: 기본 요약 항목 제거) 순서를 알아야 합니다.

@hooks.register('name_of_hook', order=1)  # Wagtail 코어의 모든 훅 다음에 실행됩니다.
def my_hook_function(arg1, arg2...)
    # 여기에 코드

@hooks.register('name_of_hook', order=-1)  # Wagtail 코어의 모든 훅 이전에 실행됩니다.
def my_other_hook_function(arg1, arg2...)
    # 여기에 코드

@hooks.register('name_of_hook', order=2)  # `my_hook_function` 다음에 실행됩니다.
def yet_another_hook_function(arg1, arg2...)
    # 여기에 코드

단위 테스트 훅

훅은 일반적으로 시작 시 등록되며 런타임에 변경할 수 없습니다. 그러나 단위 테스트를 작성할 때 단일 테스트 또는 코드 블록에 대해서만 훅을 등록하고 다른 테스트가 실행될 때 실행되지 않도록 등록을 취소할 수 있습니다.

hooks.register_temporarily 함수를 사용하여 훅을 임시로 등록할 수 있습니다. 이는 데코레이터와 컨텍스트 관리자 모두로 사용할 수 있습니다. 다음은 단일 테스트에 대해서만 훅 함수를 등록하는 방법의 예입니다.

def my_hook_function():
    pass

class MyHookTest(TestCase):

    @hooks.register_temporarily('name_of_hook', my_hook_function)
    def test_my_hook_function(self):
        # 여기에 훅이 등록된 상태에서 테스트
        pass

다음은 단일 코드 블록에 대해 훅 함수를 등록하는 예입니다.

def my_hook_function():
    pass

with hooks.register_temporarily('name_of_hook', my_hook_function):
    # 여기에 훅이 등록됨
    ..

# 여기에 훅이 등록 취소됨

with 블록에서 여러 훅을 등록해야 하는 경우 튜플 목록으로 훅을 전달할 수 있습니다.

def my_hook(...):
    pass

def my_other_hook(...):
    pass

with hooks.register_temporarily([
    ('hook_name', my_hook),
    ('hook_name', my_other_hook),
]):
    # 여기에 모든 훅이 등록됨
    ..

# 여기에 모든 훅이 등록 취소됨

사용 가능한 훅은 아래에 나열되어 있습니다.

모양

기본 CMS 기능 및 요소의 표시 및 모양을 수정하기 위한 훅입니다.

get_avatar_url

Wagtail 관리자에 표시할 사용자 지정 사용자 아바타를 지정합니다. 이 훅에 전달되는 호출 가능 객체는 user 객체와 size 매개변수를 수락해야 하며, 이는 필요한 크기 조정 또는 썸네일 처리에서 사용할 수 있습니다.

from datetime import datetime

@hooks.register('get_avatar_url')
def get_profile_avatar(user, size):
    today = datetime.now()
    is_christmas_day = today.month == 12 and today.day == 25

    if is_christmas_day:
      return '/static/images/santa.png'

    return None

관리자 모듈

관리자 인터페이스의 새 영역(페이지, 이미지, 문서 등)을 구축하기 위한 훅입니다.

construct_homepage_panels

Wagtail 관리자 홈페이지에서 패널을 추가하거나 제거합니다. 이 훅에 전달되는 호출 가능 객체는 request 객체와 패널 객체 목록을 수락해야 하며, 필요에 따라 이 목록을 제자리에서 수정해야 합니다. 패널 객체는 템플릿 컴포넌트이며, 패널의 최종 정렬된 목록에서 패널의 위치를 결정하는 정수 order 속성이 추가됩니다. 기본 패널은 100 에서 300 사이의 정수를 사용합니다.

from django.utils.html import format_html

from wagtail.admin.ui.components import Component
from wagtail import hooks

class WelcomePanel(Component):
    order = 50

    def render_html(self, parent_context):
        return format_html(
            """
            <section class="panel summary nice-padding">
              <h3>아니요, 하지만 진지하게 -- 관리자 홈페이지에 오신 것을 환영합니다.</h3>
            </section>
            """
        )

@hooks.register('construct_homepage_panels')
def add_another_welcome_panel(request, panels):
    panels.append(WelcomePanel())

construct_homepage_summary_items

관리자 홈페이지의 ‘사이트 요약’ 표시줄에서 항목을 추가하거나 제거합니다(사이트에 존재하는 페이지 및 기타 객체 수를 표시함). 이 훅에 전달되는 호출 가능 객체는 request 객체와 요약 항목 객체 목록을 수락해야 하며, 필요에 따라 이 목록을 제자리에서 수정해야 합니다. 요약 항목 객체는 wagtail.admin.site_summary.SummaryItem 의 인스턴스이며, 다음 추가 메서드 및 속성으로 Component 클래스를 확장합니다.

SummaryItem(request)

생성자; 인수로 요청 객체를 받습니다.

order

항목의 순서에서 위치를 지정하는 정수입니다.

is_shown()

이 요청에서 요약 항목을 표시해야 하는지 여부를 나타내는 부울을 반환합니다.

construct_main_menu

Wagtail 관리자 메뉴가 출력되기 직전에 호출되어 메뉴 항목 목록을 수정할 수 있습니다. 이 훅에 전달되는 호출 가능 객체는 request 객체와 menu_items 목록을 수신하며, 필요에 따라 menu_items 를 제자리에서 수정해야 합니다. 메뉴 항목 추가는 일반적으로 register_admin_menu_item 훅을 통해 수행해야 합니다. construct_main_menu 를 통해 추가된 항목은 is_shown 확인이 적용되지 않습니다.

from wagtail import hooks

@hooks.register('construct_main_menu')
def hide_explorer_menu_item_from_frank(request, menu_items):
  if request.user.username == 'frank':
    menu_items[:] = [item for item in menu_items if item.name != 'explorer']

describe_collection_contents

Wagtail이 컬렉션에 어떤 객체가 존재하는지 확인해야 할 때 호출됩니다. 현재 컬렉션을 삭제하기 전 확인 시 발생하여 비어 있지 않은 컬렉션은 삭제할 수 없도록 합니다. 이 훅에 전달되는 호출 가능 객체는 collection 객체를 수신하며, None(이 컬렉션에 객체가 없음을 나타냄) 또는 다음 키를 포함하는 사전을 반환해야 합니다.

  • count - 이 컬렉션의 항목 수

  • count_text - “3개 문서”와 같이 이 컬렉션의 항목 수를 설명하는 사람이 읽을 수 있는 문자열입니다. (다국어 지원이 있는 사이트는 여기에 번역 가능한 문자열을 반환해야 하며, django.utils.translation.ngettext 함수를 사용할 가능성이 높습니다.)

  • url (선택 사항) - 설명되는 객체를 나열하는 색인 페이지의 URL입니다.

register_account_settings_panel

관리자의 “계정” 뷰에 추가할 새 설정 패널 클래스를 등록합니다.

이 훅은 BaseSettingsPanel 의 서브클래스에 추가할 수 있습니다. 예를 들어:

from wagtail.admin.views.account import BaseSettingsPanel
from wagtail import hooks

@hooks.register('register_account_settings_panel')
class CustomSettingsPanel(BaseSettingsPanel):
    name = 'custom'
    title = "내 사용자 지정 설정"
    order = 500
    form_class = CustomSettingsForm

또는 함수에도 추가할 수 있습니다. 예를 들어, 이 함수는 위와 동일합니다.

from wagtail.admin.views.account import BaseSettingsPanel
from wagtail import hooks

class CustomSettingsPanel(BaseSettingsPanel):
    name = 'custom'
    title = "내 사용자 지정 설정"
    order = 500
    form_class = CustomSettingsForm

@hooks.register('register_account_settings_panel')
def register_custom_settings_panel(request, user, profile):
    return CustomSettingsPanel(request, user, profile)

사용 가능한 옵션에 대한 자세한 내용은 사용자 계정 설정 폼 사용자 정의를 참조하십시오.

register_account_menu_item

Wagtail 관리자의 “계정” 페이지에 있는 “추가 작업” 탭에 항목을 추가합니다. 이 훅에 대한 호출 가능 객체는 url, label, help_text 키가 있는 사전을 반환해야 합니다. 예를 들어:

from django.urls import reverse
from wagtail import hooks

@hooks.register('register_account_menu_item')
def register_account_delete_account(request):
    return {
        'url': reverse('delete-account'),
        'label': '계정 삭제',
        'help_text': '이것은 계정을 영구적으로 삭제합니다.'
    }

register_admin_menu_item

Wagtail 관리자 메뉴에 항목을 추가합니다. 이 훅에 전달되는 호출 가능 객체는 wagtail.admin.menu.MenuItem 인스턴스를 반환해야 합니다. 새 항목은 메뉴 항목의 텍스트가 될 label 과 메뉴 항목이 연결될 관리자 페이지의 URL(일반적으로 설정한 관리자 뷰에서 reverse() 를 호출하여)을 전달하여 MenuItem 클래스에서 구성할 수 있습니다. 또한 다음 키워드 인수가 허용됩니다.

  • name - 메뉴 항목을 식별하는 데 사용되는 내부 이름; 레이블의 슬러그화된 형식으로 기본 설정됩니다.

  • icon_name - 메뉴 항목 옆에 표시할 아이콘; 기본값 없음, 선택 사항이지만 최상위 메뉴 항목의 경우 축소될 때 식별할 수 있도록 설정해야 합니다.

  • classname - 링크에 적용되는 추가 클래스.

  • order - 메뉴에서 항목의 위치를 결정하는 정수입니다.

슈퍼유저만 사용할 수 있는 메뉴 항목의 경우 MenuItem 대신 wagtail.admin.menu.AdminOnlyMenuItem 서브클래스를 사용할 수 있습니다.

MenuItem 은 초기화를 사용자 지정하거나 특정 요청에 대해 항목을 조건부로 표시하거나 숨기기 위해(예: 권한 확인 적용) 추가로 서브클래스화할 수 있습니다. 자세한 내용은 소스 코드(wagtail/admin/menu.py)를 참조하십시오.

from django.urls import reverse

from wagtail import hooks
from wagtail.admin.menu import MenuItem

@hooks.register('register_admin_menu_item')
def register_frank_menu_item():
  return MenuItem('Frank', reverse('frank'), icon_name='folder-inverse', order=10000)

register_admin_urls

추가 관리자 페이지 URL을 등록합니다. 이 훅에 전달되는 호출 가능 객체는 Wagtail 관리자에 대한 확장 페이지 및 엔드포인트의 구조를 정의하는 Django URL 패턴 목록을 반환해야 합니다. 일반 Django URLconf 및 뷰에 대한 자세한 내용은 URL 디스패처를 참조하십시오.

from django.http import HttpResponse
from django.urls import path

from wagtail import hooks

def admin_view(request):
  return HttpResponse(
    "나는 많은 것을 대략적으로 알고 있습니다!",
    content_type="text/plain")

@hooks.register('register_admin_urls')
def urlconf_time():
  return [
    path('how_did_you_almost_know_my_name/', admin_view, name='frank'),
  ]

register_admin_viewset

뷰, URL 패턴 및 메뉴 항목을 단일 단위로 결합하는 ViewSet 또는 ViewSetGroup 을 관리자에 등록합니다. 이 훅에 전달되는 호출 가능 객체는 ViewSet 또는 ViewSetGroup 인스턴스를 반환해야 합니다.

from .views import CalendarViewSet

@hooks.register("register_admin_viewset")
def register_viewset():
    return CalendarViewSet()

또는 ViewSet 또는 ViewSetGroup 인스턴스 목록을 반환할 수도 있습니다.

from .views import AgendaViewSetGroup, VenueViewSet

@hooks.register("register_admin_viewset")
def register_viewsets():
    return [AgendaViewSetGroup(), VenueViewSet()]

register_group_permission_panel

‘설정’ 영역의 그룹 폼에 새 패널을 추가합니다. 이 훅에 전달되는 호출 가능 객체는 instance 키워드 인수로 그룹 객체를 허용하고 save, is_valid, as_admin_panel(그룹 편집 페이지에 포함될 HTML을 반환함) 메서드를 구현하는 ModelForm / ModelFormSet와 유사한 클래스를 반환해야 합니다.

register_settings_menu_item

register_admin_menu_item 과 동일하지만 최상위 메뉴 대신 ‘설정’ 하위 메뉴에 메뉴 항목을 등록합니다.

construct_settings_menu

construct_main_menu 와 동일하지만 최상위 메뉴 대신 ‘설정’ 하위 메뉴를 수정합니다.

register_reports_menu_item

register_admin_menu_item 과 동일하지만 최상위 메뉴 대신 ‘보고서’ 하위 메뉴에 메뉴 항목을 등록합니다.

construct_reports_menu

construct_main_menu 와 동일하지만 최상위 메뉴 대신 ‘보고서’ 하위 메뉴를 수정합니다.

register_help_menu_item

register_admin_menu_item 과 동일하지만 최상위 메뉴 대신 ‘도움말’ 하위 메뉴에 메뉴 항목을 등록합니다.

construct_help_menu

construct_main_menu 와 동일하지만 최상위 메뉴 대신 ‘도움말’ 하위 메뉴를 수정합니다.

register_admin_search_area

Wagtail 관리자 검색 “기타 검색”에 항목을 추가합니다. 이 훅의 동작은 register_admin_menu_item 과 유사합니다. 이 훅에 전달되는 호출 가능 객체는 wagtail.admin.search.SearchArea 인스턴스를 반환해야 합니다. 새 항목은 다음 매개변수를 전달하여 SearchArea 클래스에서 구성할 수 있습니다.

  • label - “기타 검색” 옵션 상자에 표시되는 텍스트.

  • name - 검색 옵션을 식별하는 데 사용되는 내부 이름; 레이블의 슬러그화된 형식으로 기본 설정됩니다.

  • url - 대상 검색 페이지의 URL.

  • classname - 링크에 적용되는 추가 CSS 클래스.

  • icon_name - 레이블 옆에 표시할 아이콘.

  • attrs - 링크에 적용할 추가 HTML 속성.

  • order - 옵션 목록에서 항목의 위치를 결정하는 정수.

URL 설정은 대상 검색 페이지에서 reverse()를 사용하여 달성할 수 있습니다. GET 매개변수 ‘q’는 주어진 URL에 추가됩니다.

search_other 템플릿 태그는 wagtailadmin_tags 템플릿 모듈에서 제공됩니다. 이 태그는 단일 선택적 매개변수 current 를 사용하며, 현재 활성화된 검색 옵션의 name 을 지정할 수 있습니다. 매개변수가 주어지지 않으면 훅은 기본적으로 페이지 URL의 역조회를 사용하여 url 매개변수와 비교합니다.

SearchArea 는 HTML 출력을 사용자 지정하거나, 옵션에 필요한 JavaScript 파일을 지정하거나, 특정 요청에 대해 항목을 조건부로 표시하거나 숨기기 위해(예: 권한 확인 적용) 서브클래스화할 수 있습니다. 자세한 내용은 소스 코드(wagtail/admin/search.py)를 참조하십시오.

from django.urls import reverse
from wagtail import hooks
from wagtail.admin.search import SearchArea

@hooks.register('register_admin_search_area')
def register_frank_search_area():
    return SearchArea('Frank', reverse('frank'), icon_name='folder-inverse', order=10000)

register_permissions

그룹 관리 영역에 표시될 Permission 객체의 QuerySet을 반환합니다.

  from django.contrib.auth.models import Permission
  from wagtail import hooks


  @hooks.register('register_permissions')
  def register_permissions():
      app = 'blog'
      model = 'extramodelset'

      return Permission.objects.filter(content_type__app_label=app, codename__in=[
          f"view_{model}", f"add_{model}", f"change_{model}", f"delete_{model}"
      ])

register_user_listing_buttons

사용자 목록에 버튼을 추가합니다.

이 훅은 두 가지 매개변수를 사용합니다.

  • user: 버튼을 생성할 사용자 객체

  • request_user: 현재 로그인한 사용자

이 예시는 현재 로그인한 사용자가 슈퍼유저인 경우 “더 보기” 드롭다운 내에 버튼을 추가하고 목록에 최상위 버튼을 추가합니다.

from wagtail.admin import widgets as wagtailadmin_widgets

@hooks.register("register_user_listing_buttons")
def user_listing_external_profile(user, request_user):
    if request_user.is_superuser:
        yield wagtailadmin_widgets.Button(
            "프로필 표시",
            f"/goes/to/a/url/{user.pk}",
            priority=30,
        )
        yield wagtailadmin_widgets.ListingButton(
            "가장",
            f"/goes/to/another/url/{user.pk}",
            priority=10,
        )

버전 7.0에서 변경: wagtail.users.widgets.UserListingButton 클래스는 wagtail.admin.widgets.Button 대신 사용되지 않습니다.

Added in version 7.0: wagtail.admin.widgets.ListingButton 클래스는 사용자 목록의 최상위 메뉴에 버튼을 추가하는 데 사용할 수 있습니다.

filter_form_submissions_for_user

사용자별, 폼별로 폼 제출에 대한 액세스를 사용자 지정할 수 있습니다.

이 훅은 두 가지 매개변수를 사용합니다.

  • 폼 제출에 액세스하려는 사용자

  • 폼 페이지의 QuerySet

훅은 사용자가 제출에 액세스할 수 있는 폼 페이지의 하위 집합을 포함하는 QuerySet 을 반환해야 합니다.

예를 들어, 비슈퍼유저가 폼 제출에 액세스하는 것을 방지하려면:

from wagtail import hooks


@hooks.register('filter_form_submissions_for_user')
def construct_forms_for_user(user, queryset):
    if not user.is_superuser:
        queryset = queryset.none()

    return queryset

편집기 인터페이스

페이지 및 스니펫에 대한 편집 인터페이스를 사용자 지정하기 위한 훅입니다.

register_rich_text_features

Wagtail의 리치 텍스트 필드는 편집기에서 사용할 수 있는 편집 컨트롤과 출력에서 허용되는 요소를 결정하는 ‘기능’ 식별자 목록과 함께 작동합니다. 예를 들어, RichTextField(features=['h2', 'h3', 'bold', 'italic', 'link']) 로 정의된 리치 텍스트 필드는 제목, 굵게/기울임꼴 서식 및 링크를 허용하지만(예: 글머리 기호 목록 또는 이미지) 허용하지 않습니다. register_rich_text_features 훅은 새 기능 식별자를 정의할 수 있도록 합니다. 자세한 내용은 서식 있는 텍스트 필드의 기능 제한를 참조하십시오.

insert_global_admin_css

모든 관리자 페이지에 추가 CSS 파일 또는 스니펫을 추가합니다.

# wagtail_hooks.py
from django.utils.html import format_html
from django.templatetags.static import static

from wagtail import hooks

@hooks.register('insert_global_admin_css')
def global_admin_css():
    return format_html('<link rel="stylesheet" href="{}">', static('my/wagtail/theme.css'))

insert_editor_js

페이지, 스니펫 및 ModelViewSet 편집 및 생성 뷰에 추가 JavaScript 파일 또는 코드 스니펫을 추가합니다. 이 훅의 출력은 편집 사용자 지정을 더 잘 테스트하기 위해 UI 스타일가이드 뷰에도 포함됩니다.

이러한 종류의 사용자 지정을 통합하는 방법에 대한 자세한 내용은 클라이언트 사이드 동작 확장하기를 참조하십시오.

# wagtail_hooks.py
from django.templatetags.static import static
from django.utils.html import format_html, format_html_join

from wagtail import hooks

@hooks.register("insert_editor_js")
def editor_js():
    js_files = [
        'js/fireworks.js', # https://fireworks.js.org에서 CDN 가져오기 URL 참조
        'js/init-fireworks.js',
    ]
    return format_html_join(
        '\n',
        '<script src="{}"></script>',
        ((static(filename),) for filename in js_files)
    )
// js/init-fireworks.js
window.addEventListener('DOMContentLoaded', (event) => {
    var container = document.createElement('div');
    container.style.cssText =
        'position: fixed; width: 100%; height: 100%; z-index: 100; top: 0; left: 0; pointer-events: none;';
    container.id = 'fireworks';
    document.getElementById('main').prepend(container);
    var options = {
        acceleration: 1.2,
        autoresize: true,
        mouse: { click: true, max: 3 },
    };
    var fireworks = new Fireworks(
        document.getElementById('fireworks'),
        options,
    );
    fireworks.start();
});

insert_global_admin_js

모든 관리자 페이지에 추가 JavaScript 파일 또는 코드 스니펫을 추가합니다.

이러한 종류의 사용자 지정을 통합하는 방법에 대한 자세한 내용은 클라이언트 사이드 동작 확장하기를 참조하십시오.

from django.utils.html import format_html

from wagtail import hooks

@hooks.register('insert_global_admin_js')
def global_admin_js():
    return format_html(
        '<script src="{}"></script>',
        "https://cdnjs.cloudflare.com/ajax/libs/three.js/r74/three.js"
    )

register_page_header_buttons

페이지 헤더의 보조 드롭다운 메뉴에 버튼을 추가합니다. 이는 register_page_listing_buttons 훅과 유사하게 작동합니다.

이 예시는 보조 드롭다운 메뉴에 간단한 버튼을 추가합니다.

from wagtail.admin import widgets as wagtailadmin_widgets

@hooks.register('register_page_header_buttons')
def page_header_buttons(page, user, view_name, next_url=None):
    yield wagtailadmin_widgets.Button(
        '드롭다운 버튼',
        '/goes/to/a/url/',
        priority=60
    )

훅에 전달되는 인수는 다음과 같습니다.

  • page - 버튼을 생성할 페이지 객체

  • user - 로그인한 사용자

  • view_name - 버튼이 페이지 목록 또는 편집 뷰에 대해 생성되는지 여부에 따라 index 또는 edit

  • next_url - 뷰가 지원하는 경우 작업 완료 시 연결된 작업이 리디렉션될 URL

priority 인수는 드롭다운에 버튼이 표시되는 순서를 제어합니다. 버튼은 낮은 우선순위부터 높은 우선순위로 정렬되므로 priority=10 인 버튼은 priority=60 인 버튼보다 먼저 표시됩니다.

편집기 워크플로

사용자가 페이지 콘텐츠를 만드는 프로세스를 통해 지시되는 방식을 사용자 지정하기 위한 훅입니다.

after_create_page

Page 객체가 데이터베이스에 저장된 후(게시된 페이지 또는 개정으로) 작업을 수행합니다. 이 훅에 전달되는 호출 가능 객체는 request 객체와 page 객체를 수락해야 합니다. 함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다. 기본적으로 Wagtail은 대신 새 페이지의 부모에 대한 탐색기 페이지로 리디렉션합니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('after_create_page')
def do_after_page_create(request, page):
    return HttpResponse("콘텐츠를 만든 것을 축하합니다!", content_type="text/plain")

Page 객체에 속성을 설정하는 경우 save_revision() 도 호출해야 합니다. 편집 및 색인 뷰는 실제 저장된 페이지 레코드 대신 개정 테이블에서 데이터를 가져오기 때문입니다.

  @hooks.register('after_create_page')
  def set_attribute_after_page_create(request, page):
      page.title = '영구 제목'
      new_revision = page.save_revision()
      if page.live:
          # 페이지가 생성되고 동시에 게시되었으므로,
          # 업데이트된 제목이 게시된 버전에도 있는지 확인합니다.
          new_revision.publish()

before_create_page

“페이지 생성” 뷰 시작 시 요청, 부모 페이지 및 페이지 모델 클래스를 전달합니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

after_create_page 와 달리 GETPOST 요청 모두에 대해 실행됩니다.

이는 뷰별로 편집기를 완전히 재정의하는 데 사용할 수 있습니다.

from wagtail import hooks

from .models import AwesomePage
from .admin_views import edit_awesome_page

@hooks.register('before_create_page')
def before_create_page(request, parent_page, page_class):
    # AwesomePage 모델에 대한 사용자 지정 생성 뷰 사용
    if page_class == AwesomePage:
        return create_awesome_page(request, parent_page)

after_delete_page

Page 객체가 삭제된 후 작업을 수행합니다. after_create_page 와 동일한 동작을 사용합니다.

before_delete_page

“페이지 삭제” 뷰 시작 시 요청 및 페이지 객체를 전달합니다.

before_create_page 와 동일한 동작을 사용하며, GETPOST 요청 모두에 대해 실행됩니다.

from django.shortcuts import redirect
from django.utils.html import format_html

from wagtail.admin import messages
from wagtail import hooks

from .models import AwesomePage


@hooks.register('before_delete_page')
def before_delete_page(request, page):
    """멋진 페이지 삭제를 차단하고 메시지를 표시합니다."""

    if request.method == 'POST' and page.specific_class in [AwesomePage]:
        messages.warning(request, "멋진 페이지는 삭제할 수 없으며, 게시 취소만 가능합니다.")
        return redirect('wagtailadmin_pages:delete', page.pk)

after_edit_page

Page 객체가 업데이트된 후 작업을 수행합니다. after_create_page 와 동일한 동작을 사용합니다.

before_edit_page

“페이지 편집” 뷰 시작 시 요청 및 페이지 객체를 전달합니다.

before_create_page 와 동일한 동작을 사용합니다.

after_publish_page

페이지 생성 뷰 또는 페이지 편집 뷰를 통해 Page 객체가 게시된 후 작업을 수행합니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

before_publish_page

페이지 생성 뷰 또는 페이지 편집 뷰를 통해 Page 객체가 게시되기 전에 작업을 수행합니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

after_unpublish_page

“게시 취소” 뷰에서 게시 취소 작업 후 요청 및 페이지 객체를 전달합니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

before_unpublish_page

“게시 취소” 뷰에서 게시 취소 작업 전에 요청 및 페이지 객체를 전달합니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

after_copy_page

Page 객체가 복사된 후 요청, 페이지 객체 및 새로 복사된 페이지를 전달하여 작업을 수행합니다. after_create_page 와 동일한 동작을 사용합니다.

before_copy_page

“페이지 복사” 뷰 시작 시 요청 및 페이지 객체를 전달합니다.

before_create_page 와 동일한 동작을 사용합니다.

after_move_page

Page 객체가 이동된 후 요청 및 페이지 객체를 전달하여 작업을 수행합니다. after_create_page 와 동일한 동작을 사용합니다.

before_move_page

“페이지 이동” 뷰 시작 시 요청, 페이지 객체 및 대상 페이지 객체를 전달합니다.

before_create_page 와 동일한 동작을 사용합니다.

before_convert_alias_page

별칭 페이지를 일반 Wagtail 페이지로 변환하는 convert_alias 뷰 시작 시 호출됩니다.

요청과 변환되는 페이지가 훅의 인수로 전달됩니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

after_convert_alias_page

Page 객체가 별칭에서 변환된 후 작업을 수행합니다.

요청과 방금 변환된 페이지가 훅의 인수로 전달됩니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

construct_translated_pages_to_cascade_actions

동기화된 트리 설정에서 처리할 추가 페이지를 반환합니다.

이 훅은 WAGTAIL_I18N_ENABLED = True 일 때 페이지 게시 취소 시에만 트리거됩니다.

페이지 목록과 작업이 훅의 인수로 전달됩니다.

함수는 페이지 목록의 페이지를 키로 하고 작업을 수행할 추가 페이지 목록을 값으로 하는 사전을 반환해야 합니다. 별칭이 없는, 함수 인수의 페이지에 대한 직접 번역을 권장합니다.

register_page_action_menu_item

페이지 생성 및 편집 뷰의 작업 팝업 메뉴에 항목을 추가합니다. 이 훅에 전달되는 호출 가능 객체는 wagtail.admin.action_menu.ActionMenuItem 인스턴스를 반환해야 합니다. ActionMenuItemComponent의 서브클래스이므로 template_name, get_context_data, render_htmlMedia 를 통해 메뉴 항목의 렌더링을 사용자 지정할 수 있습니다. 또한 다음 속성 및 메서드를 재정의할 수 있습니다.

  • order - 메뉴에서 항목의 위치를 결정하는 정수(기본값 100)입니다. 객체 생성자에 키워드 인수로 전달할 수도 있습니다. 이 시퀀스에서 가장 낮은 번호의 항목이 기본 메뉴 항목으로 선택됩니다. 표준적으로 이는 “초안 저장”입니다(order가 0).

  • label - 메뉴 항목의 표시 텍스트

  • get_url - 메뉴 항목이 연결될 URL을 반환하는 메서드; 기본적으로 None 을 반환하며, 이는 메뉴 항목이 대신 폼 제출 버튼으로 동작하도록 합니다.

  • name - URL이 지정되지 않은 경우 제출 버튼의 name 속성 값

  • icon_name - 메뉴 항목 옆에 표시할 아이콘

  • classname - 버튼 요소에 추가할 class 속성 값

  • is_shown - 메뉴 항목을 표시해야 하는지 여부를 나타내는 부울을 반환하는 메서드; 기본적으로 잠긴 페이지를 편집할 때를 제외하고는 true입니다.

get_url, is_shown, get_context_data, render_html 메서드는 모두 다음 필드를 포함하는 컨텍스트 사전을 허용합니다.

  • view - 현재 뷰의 이름: 'create', 'edit' 또는 'revisions_revert'

  • page - view = 'edit' 또는 'revisions_revert' 의 경우 편집 중인 페이지

  • parent_page - view = 'create' 의 경우 생성 중인 페이지의 부모 페이지

  • request - 현재 요청 객체

from wagtail import hooks
from wagtail.admin.action_menu import ActionMenuItem

class GuacamoleMenuItem(ActionMenuItem):
    name = 'action-guacamole'
    label = "과카몰리"

    def get_url(self, context):
        return "https://www.youtube.com/watch?v=dNJdJIwCF_Y"


@hooks.register('register_page_action_menu_item')
def register_guacamole_menu_item():
    return GuacamoleMenuItem(order=10)

construct_page_action_menu

페이지 생성 및 편집 뷰의 작업 메뉴 항목 최종 목록을 수정합니다. 이 훅에 전달되는 호출 가능 객체는 ActionMenuItem 객체 목록, 요청 객체 및 register_page_action_menu_item 에 따른 컨텍스트 사전을 수신하며, 메뉴 항목 목록을 제자리에서 수정해야 합니다.

@hooks.register('construct_page_action_menu')
def remove_submit_to_moderator_option(menu_items, request, context):
    menu_items[:] = [item for item in menu_items if item.name != 'action-submit']

construct_page_action_menu 훅은 메뉴 항목이 순서 속성별로 정렬된 후에 호출되므로 이 시점에서는 메뉴 항목의 순서를 설정해도 아무런 효과가 없습니다. 대신 항목은 목록에서 위치를 변경하여 재정렬할 수 있으며, 첫 번째 항목이 기본 작업으로 선택됩니다. 예를 들어, 기본 작업을 게시로 변경하려면:

@hooks.register('construct_page_action_menu')
def make_publish_default_action(menu_items, request, context):
    for (index, item) in enumerate(menu_items):
        if item.name == 'action-publish':
            # 목록 맨 위로 이동
            menu_items.pop(index)
            menu_items.insert(0, item)
            break

construct_wagtail_userbar

Wagtail 사용자 바에서 항목을 추가하거나 제거합니다. 추가 및 편집 작업은 기본적으로 제공됩니다. 훅에 전달되는 호출 가능 객체는 request 객체, 메뉴 객체 목록 items 및 페이지 객체 page 인스턴스를 수락해야 합니다. 메뉴 항목 객체는 request 객체를 수락하고 메뉴 항목을 나타내는 HTML 문자열을 반환할 수 있는 render 메서드를 가져야 합니다. 자세한 내용은 사용자 바 템플릿 및 메뉴 항목 클래스를 참조하십시오. 특히 접근성 검사기 항목에 대한 AccessibilityItem 클래스도 참조하십시오.

from wagtail import hooks

class UserbarPuppyLinkItem:
    def render(self, request):
        return '<li><a href="http://cuteoverload.com/tag/puppehs/" ' \
            + 'target="_parent" role="menuitem" class="action">강아지!</a></li>'

@hooks.register('construct_wagtail_userbar')
def add_puppy_link_item(request, items, page):
    return items.append( UserbarPuppyLinkItem() )

작업에서 아이콘을 사용하려면 사용자 바 템플릿을 재정의하여 선언해야 합니다.

관리자 워크플로

관리자가 사용자를 편집하는 프로세스를 통해 지시되는 방식을 사용자 지정하기 위한 훅입니다.

after_create_user

User 객체가 데이터베이스에 저장된 후 작업을 수행합니다. 이 훅에 전달되는 호출 가능 객체는 request 객체와 user 객체를 수락해야 합니다. 함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용합니다. 기본적으로 Wagtail은 대신 사용자 색인 페이지로 리디렉션합니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('after_create_user')
def do_after_create_user(request, user):
    return HttpResponse("새 사용자를 만든 것을 축하합니다!", content_type="text/plain")

before_create_user

“사용자 생성” 뷰 시작 시 요청을 전달합니다.

함수는 아무것도 반환할 필요가 없지만, status_code 속성이 있는 객체가 반환되면 Wagtail은 이를 응답 객체로 사용하고 뷰의 나머지 부분을 건너뜁니다.

after_create_user 와 달리 GETPOST 요청 모두에 대해 실행됩니다.

이는 뷰별로 사용자 편집기를 완전히 재정의하는 데 사용할 수 있습니다.

from django.http import HttpResponse

from wagtail import hooks

from .models import AwesomePage
from .admin_views import edit_awesome_page

@hooks.register('before_create_user')
def do_before_create_user(request):
    return HttpResponse("사용자 생성 폼", content_type="text/plain")

after_delete_user

User 객체가 삭제된 후 작업을 수행합니다. after_create_user 와 동일한 동작을 사용합니다.

before_delete_user

“사용자 삭제” 뷰 시작 시 요청 및 사용자 객체를 전달합니다.

before_create_user 와 동일한 동작을 사용합니다.

after_edit_user

User 객체가 업데이트된 후 작업을 수행합니다. after_create_user 와 동일한 동작을 사용합니다.

before_edit_user

“사용자 편집” 뷰 시작 시 요청 및 사용자 객체를 전달합니다.

before_create_user 와 동일한 동작을 사용합니다.

선택기

construct_page_chooser_queryset

페이지 선택기 뷰를 렌더링할 때 호출되어 페이지 목록 QuerySet을 사용자 지정할 수 있습니다. 훅에 전달되는 호출 가능 객체는 현재 페이지 QuerySet과 요청 객체를 수신하며, 페이지 QuerySet(원본 또는 새 QuerySet)을 반환해야 합니다.

from wagtail import hooks

@hooks.register('construct_page_chooser_queryset')
def show_my_pages_only(pages, request):
    # 자신의 페이지만 표시
    pages = pages.filter(owner=request.user)

    return pages

construct_document_chooser_queryset

문서 선택기 뷰를 렌더링할 때 호출되어 문서 목록 QuerySet을 사용자 지정할 수 있습니다. 훅에 전달되는 호출 가능 객체는 현재 문서 QuerySet과 요청 객체를 수신하며, 문서 QuerySet(원본 또는 새 QuerySet)을 반환해야 합니다.

from wagtail import hooks

@hooks.register('construct_document_chooser_queryset')
def show_my_uploaded_documents_only(documents, request):
    # 업로드된 문서만 표시
    documents = documents.filter(uploaded_by_user=request.user)

    return documents

construct_image_chooser_queryset

이미지 선택기 뷰를 렌더링할 때 호출되어 이미지 목록 QuerySet을 사용자 지정할 수 있습니다. 훅에 전달되는 호출 가능 객체는 현재 이미지 QuerySet과 요청 객체를 수신하며, 이미지 QuerySet(원본 또는 새 QuerySet)을 반환해야 합니다.

from wagtail import hooks

@hooks.register('construct_image_chooser_queryset')
def show_my_uploaded_images_only(images, request):
    # 업로드된 이미지만 표시
    images = images.filter(uploaded_by_user=request.user)

    return images

페이지 탐색기

construct_explorer_page_queryset

페이지 탐색기 뷰를 렌더링할 때 호출되어 페이지 목록 QuerySet을 사용자 지정할 수 있습니다. 훅에 전달되는 호출 가능 객체는 부모 페이지 객체, 현재 페이지 QuerySet 및 요청 객체를 수신하며, 페이지 QuerySet(원본 또는 새 QuerySet)을 반환해야 합니다.

from wagtail import hooks

@hooks.register('construct_explorer_page_queryset')
def show_my_profile_only(parent_page, pages, request):
    # 'user-profiles' 섹션에 있는 경우 사용자 자신의 프로필만 표시
    if parent_page.slug == 'user-profiles':
        pages = pages.filter(owner=request.user)

    return pages

register_page_listing_buttons

페이지 탐색기에서 페이지의 작업 목록에 버튼을 추가합니다. 이는 번역 또는 복잡한 워크플로와 같은 사용자 지정 작업을 목록에 추가할 때 유용합니다.

이 예시는 목록에 간단한 버튼을 추가합니다.

from wagtail.admin import widgets as wagtailadmin_widgets

@hooks.register('register_page_listing_buttons')
def page_listing_buttons(page, user, next_url=None):
    yield wagtailadmin_widgets.ListingButton(
        '페이지 목록 버튼',
        '/goes/to/a/url/',
        priority=10
    )

훅에 전달되는 인수는 다음과 같습니다.

  • page - 버튼을 생성할 페이지 객체

  • user - 로그인한 사용자

  • next_url - 뷰가 지원하는 경우 작업 완료 시 연결된 작업이 리디렉션될 URL

priority 인수는 버튼이 표시되는 순서를 제어합니다. 버튼은 낮은 우선순위부터 높은 우선순위로 정렬되므로 priority=10 인 버튼은 priority=20 인 버튼보다 먼저 표시됩니다.

버전 7.0에서 변경: PageListingButton 클래스는 ListingButton 대신 사용되지 않습니다.

Added in version 7.0: wagtail.admin.widgets.ListingButton 클래스는 페이지 목록의 최상위 메뉴에 버튼을 추가하는 데 사용할 수 있습니다.

register_page_listing_more_buttons

페이지 탐색기에서 페이지의 “더 보기” 드롭다운 메뉴에 버튼을 추가합니다. 이는 register_page_listing_buttons 훅과 유사하게 작동하지만, 드롭다운에 더 적합한 덜 사용되는 사용자 지정 작업에 유용합니다.

이 예시는 드롭다운 메뉴에 간단한 버튼을 추가합니다.

from wagtail.admin import widgets as wagtailadmin_widgets

@hooks.register('register_page_listing_more_buttons')
def page_listing_more_buttons(page, user, next_url=None):
    yield wagtailadmin_widgets.Button(
        '드롭다운 버튼',
        '/goes/to/a/url/',
        priority=60
    )

훅에 전달되는 인수는 다음과 같습니다.

  • page - 버튼을 생성할 페이지 객체

  • user - 로그인한 사용자

  • next_url - 뷰가 지원하는 경우 작업 완료 시 연결된 작업이 리디렉션될 URL

priority 인수는 드롭다운에 버튼이 표시되는 순서를 제어합니다. 버튼은 낮은 우선순위부터 높은 우선순위로 정렬되므로 priority=10 인 버튼은 priority=60 인 버튼보다 먼저 표시됩니다.

드롭다운 목록이 있는 버튼

관리자 위젯은 ButtonWithDropdownFromHook 도 제공하며, 이를 통해 버튼에 첨부되는 드롭다운 메뉴를 생성하기 위한 사용자 지정 훅을 정의할 수 있습니다.

드롭다운 메뉴가 있는 버튼을 만들려면 두 단계가 필요합니다. 첫째, 위 예시와 마찬가지로 register_page_listing_buttons 훅에 버튼을 추가합니다. 둘째, 드롭다운 메뉴의 내용을 반환하는 새 훅을 등록합니다.

이 예시는 Wagtail의 기본 관리자 드롭다운이 구현되는 방법을 보여줍니다. 이 경우 page.permissions_for_user 로 사용자 권한을 테스트하여 버튼을 조건부로 등록하는 방법도 볼 수 있습니다.

from wagtail.admin import widgets as wagtailadmin_widgets

@hooks.register('register_page_listing_buttons')
def page_custom_listing_buttons(page, user, next_url=None):
    yield wagtailadmin_widgets.ButtonWithDropdownFromHook(
        '추가 작업',
        hook_name='my_button_dropdown_hook',
        page=page,
        user=user,
        next_url=next_url,
        priority=50
    )

@hooks.register('my_button_dropdown_hook')
def page_custom_listing_more_buttons(page, user, next_url=None):
    page_perms = page.permissions_for_user(user)
    if page_perms.can_move():
        yield wagtailadmin_widgets.Button('이동', reverse('wagtailadmin_pages:move', args=[page.id]), priority=10)
    if page_perms.can_delete():
        yield wagtailadmin_widgets.Button('삭제', reverse('wagtailadmin_pages:delete', args=[page.id]), priority=30)
    if page_perms.can_unpublish():
        yield wagtailadmin_widgets.Button('게시 취소', reverse('wagtailadmin_pages:unpublish', args=[page.id]), priority=40)

드롭다운 버튼의 템플릿은 wagtailadmin/pages/listing/_button_with_dropdown.html 을 재정의하여 사용자 지정할 수 있습니다. 드롭다운 UI 구성 요소 자체는 그대로 두십시오.

construct_page_listing_buttons

페이지 탐색기에서 페이지 목록 버튼의 최종 목록을 수정합니다. 이 훅에 전달되는 호출 가능 객체는 ListingButton 객체 목록, 페이지, 사용자 객체 및 컨텍스트 사전을 수신하며, 목록 항목 목록을 제자리에서 수정해야 합니다.

@hooks.register('construct_page_listing_buttons')
def remove_page_listing_button_item(buttons, page, user, context=None):
    if page.is_root:
        buttons.pop() # 루트 페이지 목록 버튼에서 마지막 '더 보기' 드롭다운 버튼을 제거합니다.

페이지 제공

before_serve_page

Wagtail이 페이지를 제공하려고 할 때 호출됩니다. 훅에 전달되는 호출 가능 객체는 페이지 객체, 요청 객체, 페이지의 serve() 메서드에 전달될 argskwargs 를 수신합니다. 호출 가능 객체가 HttpResponse 를 반환하면 해당 응답은 사용자에게 즉시 반환되며, Wagtail은 페이지에서 serve() 를 호출하지 않습니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('before_serve_page')
def block_googlebot(page, request, serve_args, serve_kwargs):
    if request.META.get('HTTP_USER_AGENT') == 'GoogleBot':
        return HttpResponse("<h1>나쁜 구글봇 쿠키 없음</h1>")

on_serve_page

Wagtail이 페이지를 제공할 때 before_serve_page 이후에 호출되지만 페이지의 serve() 메서드가 호출되기 전입니다. before_serve_page 와 달리 이 훅은 대체 응답을 반환하는 것 외에 제공 체인을 수정할 수 있도록 합니다.

이 훅에 전달되는 호출 가능 객체는 함수를 인수로 수락하고 그 자리에 사용될 새 함수를 반환해야 합니다. 전달된 함수는 제공 체인의 다음 호출 가능 객체가 됩니다.

예를 들어, 응답에 사용자 지정 캐시 헤더를 추가하려면:

from wagtail import hooks

@hooks.register('on_serve_page')
def add_custom_headers(next_serve_page):
    def wrapper(page, request, args, kwargs):
        response = next_serve_page(page, request, args, kwargs)
        response['Custom-Header'] = 'value'
        return response
    return wrapper

함수에 전달되는 매개변수:

  • page - 제공되는 페이지 객체

  • request - 요청 객체

  • args - 페이지의 serve 메서드에 전달될 위치 인수

  • kwargs - 페이지의 serve 메서드에 전달될 키워드 인수

이 훅은 특히 다음 용도로 유용합니다.

  • 응답 헤더 추가/수정

  • 액세스 제한 구현

  • 응답 콘텐츠 수정

  • 로깅 또는 모니터링 추가

문서 제공

before_serve_document

Wagtail이 문서를 제공하려고 할 때 호출됩니다. 훅에 전달되는 호출 가능 객체는 문서 객체와 요청 객체를 수신합니다. 호출 가능 객체가 HttpResponse 를 반환하면 해당 응답은 사용자에게 즉시 반환되며, 문서가 제공되지 않습니다. WAGTAILDOCS_SERVE_METHOD 설정이 direct 로 설정된 경우 이 훅은 건너뜁니다.

스니펫

등록된 스니펫 작업용 훅입니다.

after_edit_snippet

스니펫이 편집될 때 호출됩니다. 훅에 전달되는 호출 가능 객체는 모델 인스턴스, 요청 객체를 수신합니다. 호출 가능 객체가 HttpResponse 를 반환하면 해당 응답은 사용자에게 즉시 반환되며, Wagtail은 목록 뷰로 redirect() 를 호출하지 않습니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('after_edit_snippet')
def after_snippet_update(request, instance):
    return HttpResponse(f"ID {instance.pk}인 스니펫을 편집한 것을 축하합니다.", content_type="text/plain")

before_edit_snippet

편집 스니펫 뷰 시작 시 호출됩니다. 훅에 전달되는 호출 가능 객체는 모델 인스턴스, 요청 객체를 수신합니다. 호출 가능 객체가 HttpResponse 를 반환하면 해당 응답은 사용자에게 즉시 반환되며, Wagtail은 목록 뷰로 redirect() 를 호출하지 않습니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('before_edit_snippet')
def block_snippet_edit(request, instance):
    if isinstance(instance, RestrictedSnippet) and instance.prevent_edit:
        return HttpResponse("죄송합니다. 이 스니펫은 편집할 수 없습니다.", content_type="text/plain")

after_create_snippet

스니펫이 생성될 때 호출됩니다. after_create_snippetafter_edit_snippet 은 동일한 방식으로 작동합니다. 유일한 차이점은 훅이 호출되는 위치입니다.

before_create_snippet

생성 스니펫 뷰 시작 시 호출됩니다. 모델이 인스턴스 대신 인수로 전달된다는 점을 제외하고 before_edit_snippet 과 유사하게 작동합니다.

after_delete_snippet

스니펫이 삭제될 때 호출됩니다. 훅에 전달되는 호출 가능 객체는 모델 인스턴스(목록으로)와 요청 객체를 수신합니다. 호출 가능 객체가 HttpResponse 를 반환하면 해당 응답은 사용자에게 즉시 반환되며, Wagtail은 목록 뷰로 redirect() 를 호출하지 않습니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('after_delete_snippet')
def after_snippet_delete(request, instances):
    # "instances"는 목록입니다.
    total = len(instances)
    return HttpResponse(f"{total}개의 스니펫이 삭제되었습니다.", content_type="text/plain")

before_delete_snippet

삭제 스니펫 뷰 시작 시 호출됩니다. 훅에 전달되는 호출 가능 객체는 모델 인스턴스(목록으로)와 요청 객체를 수신합니다. 호출 가능 객체가 HttpResponse 를 반환하면 해당 응답은 사용자에게 즉시 반환되며, Wagtail은 목록 뷰로 redirect() 를 호출하지 않습니다.

from django.http import HttpResponse

from wagtail import hooks

@hooks.register('before_delete_snippet')
def before_snippet_delete(request, instances):
    # "instances"는 목록입니다.
    total = len(instances)

    if request.method == 'POST':
        for instance in instances:
            # 삭제 동작 재정의
            instance.delete()

        return HttpResponse(f"{total}개의 스니펫이 삭제되었습니다.", content_type="text/plain")

register_snippet_action_menu_item

스니펫 생성 및 편집 뷰의 작업 팝업 메뉴에 항목을 추가합니다.

이 훅에 전달되는 호출 가능 객체는 스니펫의 모델 클래스를 인수로 수신하며, wagtail.snippets.action_menu.ActionMenuItem 인스턴스를 반환해야 합니다. ActionMenuItemComponent의 서브클래스이므로 template_name, get_context_data, render_htmlMedia 를 통해 메뉴 항목의 렌더링을 사용자 지정할 수 있습니다. 또한 다음 속성 및 메서드를 재정의할 수 있습니다.

  • order - 메뉴에서 항목의 위치를 결정하는 정수(기본값 100)입니다. 객체 생성자에 키워드 인수로 전달할 수도 있습니다. 이 시퀀스에서 가장 낮은 번호의 항목이 기본 메뉴 항목으로 선택됩니다. 표준적으로 이는 “초안 저장”입니다(order가 0).

  • label - 메뉴 항목의 표시 텍스트

  • get_url - 메뉴 항목이 연결될 URL을 반환하는 메서드; 기본적으로 None 을 반환하며, 이는 메뉴 항목이 대신 폼 제출 버튼으로 동작하도록 합니다.

  • name - URL이 지정되지 않은 경우 제출 버튼의 name 속성 값

  • icon_name - 메뉴 항목 옆에 표시할 아이콘

  • classname - 버튼 요소에 추가할 class 속성 값

  • is_shown - 메뉴 항목을 표시해야 하는지 여부를 나타내는 부울을 반환하는 메서드; 기본적으로 잠긴 페이지를 편집할 때를 제외하고는 true입니다.

get_url, is_shown, get_context_data, render_html 메서드는 모두 다음 필드를 포함하는 컨텍스트 사전을 허용합니다.

  • view - 현재 뷰의 이름: 'create' 또는 'edit'

  • model - 스니펫의 모델 클래스

  • instance - view = 'edit' 의 경우 편집 중인 인스턴스

  • request - 현재 요청 객체

from wagtail import hooks
from wagtail.snippets.action_menu import ActionMenuItem

class GuacamoleMenuItem(ActionMenuItem):
    name = 'action-guacamole'
    label = "과카몰리"

    def get_url(self, context):
        return "https://www.youtube.com/watch?v=dNJdJIwCF_Y"


@hooks.register('register_snippet_action_menu_item')
def register_guacamole_menu_item(model):
    return GuacamoleMenuItem(order=10)

construct_snippet_action_menu

스니펫 생성 및 편집 뷰의 작업 메뉴 항목 최종 목록을 수정합니다. 이 훅에 전달되는 호출 가능 객체는 ActionMenuItem 객체 목록, 요청 객체 및 register_snippet_action_menu_item 에 따른 컨텍스트 사전을 수신하며, 메뉴 항목 목록을 제자리에서 수정해야 합니다.

@hooks.register('construct_snippet_action_menu')
def remove_delete_option(menu_items, request, context):
    menu_items[:] = [item for item in menu_items if item.name != 'delete']

construct_snippet_action_menu 훅은 메뉴 항목이 순서 속성별로 정렬된 후에 호출되므로 이 시점에서는 메뉴 항목의 순서를 설정해도 아무런 효과가 없습니다. 대신 항목은 목록에서 위치를 변경하여 재정렬할 수 있으며, 첫 번째 항목이 기본 작업으로 선택됩니다. 예를 들어, 기본 작업을 삭제로 변경하려면:

@hooks.register('construct_snippet_action_menu')
def make_delete_default_action(menu_items, request, context):
    for (index, item) in enumerate(menu_items):
        if item.name == 'delete':
            # 목록 맨 위로 이동
            menu_items.pop(index)
            menu_items.insert(0, item)
            break

register_snippet_listing_buttons

스니펫 목록에서 스니펫의 작업 목록에 버튼을 추가합니다. 이는 번역 또는 복잡한 워크플로와 같은 사용자 지정 작업을 목록에 추가할 때 유용합니다.

이 예시는 “더 보기” 드롭다운 내에 버튼을 추가하고 목록에 최상위 버튼을 추가합니다.

from wagtail.admin import widgets as wagtailadmin_widgets

@hooks.register('register_snippet_listing_buttons')
def snippet_listing_buttons(snippet, user, next_url=None):
    yield wagtailadmin_widgets.Button(
        '"더 보기" 드롭다운 내의 스니펫 목록 버튼',
        '/goes/to/a/url/',
        priority=90
    )
    yield wagtailadmin_widgets.ListingButton(
        '최상위 스니펫 목록 버튼',
        '/goes/to/a/url/',
        priority=10
    )

훅에 전달되는 인수는 다음과 같습니다.

  • snippet - 버튼을 생성할 스니펫 객체

  • user - 스니펫 목록을 보고 있는 사용자

  • next_url - 뷰가 지원하는 경우 작업 완료 시 연결된 작업이 리디렉션될 URL

priority 인수는 버튼이 표시되는 순서를 제어합니다. 버튼은 낮은 우선순위부터 높은 우선순위로 정렬되므로 priority=10 인 버튼은 priority=20 인 버튼보다 먼저 표시됩니다.

버전 7.0에서 변경: wagtail.snippets.widgets.SnippetListingButton 클래스는 wagtail.admin.widgets.Button 대신 사용되지 않습니다.

Added in version 7.0: wagtail.admin.widgets.ListingButton 클래스는 스니펫 목록의 최상위 메뉴에 버튼을 추가하는 데 사용할 수 있습니다.

construct_snippet_listing_buttons

“더 보기” 드롭다운 메뉴에서 스니펫 목록 버튼의 최종 목록을 수정합니다. 이 훅에 전달되는 호출 가능 객체는 Button 객체 목록, 스니펫 객체 및 사용자를 수신하며, 메뉴 항목 목록을 제자리에서 수정해야 합니다.

@hooks.register('construct_snippet_listing_buttons')
def remove_snippet_listing_button_item(buttons, snippet, user):
    buttons.pop()  # '삭제' 버튼 제거

대량 작업

대량 작업을 등록하고 사용자 지정하기 위한 훅입니다. 사용자 지정 대량 작업을 작성하는 방법은 사용자 지정 대량 작업 추가를 참조하십시오.

register_bulk_action

탐색기의 대량 작업 목록에 추가할 새 대량 작업을 등록합니다.

이 훅은 BulkAction 의 서브클래스로 등록되어야 합니다. 예를 들어:

from wagtail.admin.views.bulk_action import BulkAction
from wagtail import hooks


@hooks.register("register_bulk_action")
class CustomBulkAction(BulkAction):
    display_name = _("사용자 지정 작업")
    action_type = "action"
    aria_label = _("사용자 지정 작업 수행")
    template_name = "/path/to/template"
    models = [...]  # 작업이 실행될 모델 목록


    @classmethod
    def execute_action(cls, objects, **kwargs):
        for object in objects:
            do_something(object)
        return num_parent_objects, num_child_objects  # 업데이트된 객체 수 반환

before_bulk_action

대량 작업이 실행되기 직전에 작업을 수행합니다(execute_action 메서드가 호출되기 전).

이 훅은 HTTP 응답을 반환하는 데 사용할 수 있습니다. 예를 들어:

from wagtail import hooks

@hooks.register("before_bulk_action")
def hook_func(request, action_type, objects, action_class_instance):
  if action_type == 'delete':
    return HttpResponse(f"{len(objects)}개 객체가 삭제될 것입니다.", content_type="text/plain")

after_bulk_action

대량 작업이 실행된 직후 작업을 수행합니다(execute_action 메서드가 호출된 후).

이 훅은 HTTP 응답을 반환하는 데 사용할 수 있습니다. 예를 들어:

from wagtail import hooks

@hooks.register("after_bulk_action")
def hook_func(request, action_type, objects, action_class_instance):
  if action_type == 'delete':
    return HttpResponse(f"{len(objects)}개 객체가 삭제되었습니다.", content_type="text/plain")

감사 로그

register_log_actions

감사 로그 참조

레지스트리에 새 작업을 추가하려면 작업 유형, 레이블 및 관리 목록에 표시될 메시지와 함께 register_action 메서드를 호출합니다.

from django.utils.translation import gettext_lazy as _

from wagtail import hooks

@hooks.register('register_log_actions')
def additional_log_actions(actions):
    actions.register_action('wagtail_package.echo', _('에코'), _('에코를 보냈습니다.'))

또는 로그 항목의 데이터에 따라 달라지는 로그 메시지의 경우 format_message 메서드를 재정의하는 wagtail.log_actions.LogFormatter 의 서브클래스를 만들고 해당 클래스에 데코레이터로 register_action 을 사용합니다.

from django.utils.translation import gettext_lazy as _

from wagtail import hooks
from wagtail.log_actions import LogFormatter

@hooks.register('register_log_actions')
def additional_log_actions(actions):
    @actions.register_action('wagtail_package.greet_audience')
    class GreetingActionFormatter(LogFormatter):
        label = _('청중에게 인사')

        def format_message(self, log_entry):
            return _('안녕하세요 %(audience)s') % {
                'audience': log_entry.data['audience'],
            }

이미지

register_image_operations

시작 시 호출됩니다. 렌디션을 만드는 데 사용할 수 있는 이미지 작업을 등록합니다.

사용자 정의 이미지 필터를 참조하십시오.