# 시그널 Wagtail의 [](revision_model_ref) 및 [](page_model_ref)는 `django.dispatch` 의 [시그널](inv:django#topics/signals)을 구현합니다. 시그널은 페이지 게시/게시 취소 이벤트에서 부작용을 생성하는 데 유용합니다. 예를 들어, 시그널을 사용하여 메시징 서비스에 게시 알림을 보내거나, 정적 사이트 생성기와 같이 API를 사용하는 다른 앱에 메시지를 `POST` 할 수 있습니다. ## `page_published` 이 시그널은 페이지 개정이 `published` 로 설정될 때 `Revision` 에서 발생합니다. - `sender` - 페이지 `class`. - `instance` - 특정 `Page` 인스턴스. - `revision` - 게시된 `Revision`. - `kwargs` - `page_published.send()` 에 전달된 다른 인수. 시그널을 수신하려면 `page_published.connect(receiver, sender, **kwargs)` 를 구현합니다. 다음은 무언가가 게시될 때 팀에 알리는 간단한 예시입니다. ```python from wagtail.signals import page_published import requests # 새 페이지가 게시될 때 모든 사람에게 알립니다. def send_to_slack(sender, **kwargs): instance = kwargs['instance'] url = 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' values = { "text" : "%s가 %s에 의해 게시되었습니다." % (instance.title, instance.owner.username), "channel": "#publish-notifications", "username": "콘텐츠 오징어", "icon_emoji": ":octopus:" } response = requests.post(url, values) # 수신자 등록 page_published.connect(send_to_slack) ``` ### 특정 모델 이벤트 수신 때로는 모든 모델에 대한 시그널을 수신하는 데 관심이 없거나 특정 모델에 대한 시그널을 다른 방식으로 처리하고 싶을 수 있습니다. 예를 들어, 새 블로그 게시물이 게시될 때 무언가를 하고 싶을 수 있습니다. ```python from wagtail.signals import page_published from mysite.models import BlogPostPage # 각 모델 유형에 대해 영리한 작업 수행 def receiver(sender, **kwargs): # 블로그 게시물로 작업 수행 pass # 각 페이지 모델 클래스에 대한 리스너 등록 page_published.connect(receiver, sender=BlogPostPage) ``` Wagtail은 `wagtail.models` 의 `get_page_models()` 함수를 통해 등록된 페이지 유형 목록에 대한 액세스를 제공합니다. 발신자 지정에 대한 자세한 내용은 [Django 문서](inv:django#topics/signals)를 참조하십시오. ## `page_unpublished` 이 시그널은 페이지가 게시 취소될 때 `Page` 에서 발생합니다. - `sender` - 페이지 `class`. - `instance` - 특정 `Page` 인스턴스. - `kwargs` - `page_unpublished.send()` 에 전달된 다른 인수. ## `pre_page_move` 및 `post_page_move` 이 시그널은 `Page` 가 이동되기 직전과 직후에 `Page` 에서 발생합니다. 데이터베이스 변경 사항이 적용되기 **전**에 값을 알아야 하는 경우 `pre_page_move` 를 구독하십시오. 예: 페이지의 이전 URL 또는 해당 하위 페이지의 URL 가져오기. 데이터베이스 변경 사항이 적용된 **후**에 값을 알아야 하는 경우 `post_page_move` 를 구독하십시오. 예: 페이지의 새 URL 또는 해당 하위 페이지의 URL 가져오기. 두 시그널 모두에 대해 다음 인수가 발생합니다. - `sender` - 페이지 `class`. - `instance` - 특정 `Page` 인스턴스. - `parent_page_before` - 이동 **전** `instance` 의 부모 페이지. - `parent_page_after` - 이동 **후** `instance` 의 부모 페이지. - `url_path_before` - 이동 **전** `instance.url_path` 의 값. - `url_path_after` - 이동 **후** `instance.url_path` 의 값. - `kwargs` - `pre_page_move.send()` 또는 `post_page_move.send()` 에 전달된 다른 인수. ### '이동'과 '재정렬' 구분 시그널은 페이지가 다른 섹션으로 이동된 결과(‘이동’) 또는 동일한 섹션 내에서 다른 위치로 이동된 결과(‘재정렬’)로 발생할 수 있습니다. 둘 사이의 차이를 아는 것이 특히 유용할 수 있습니다. ‘이동’만 페이지의 URL(및 해당 하위 페이지의 URL)에 영향을 미치고, ‘재정렬’은 자연스러운 페이지 순서에만 영향을 미치기 때문입니다. 이는 아마도 영향이 덜할 것입니다. ‘이동’과 ‘재정렬’을 구분하는 가장 좋은 방법은 `url_path_before` 와 `url_path_after` 값을 비교하는 것입니다. 예를 들어: ```python from wagtail.signals import pre_page_move from wagtail.contrib.frontend_cache.utils import purge_page_from_cache # 페이지가 다른 섹션으로 이동할 때 페이지의 이전 URL을 캐시에서 지웁니다. def clear_page_url_from_cache_on_move(sender, **kwargs): if kwargs['url_path_before'] == kwargs['url_path_after']: # URL이 변경되지 않습니다 :) 할 일이 없습니다! return # 페이지가 새 섹션으로 이동하고 있으므로(새 사이트일 수도 있음) # 캐시에서 이전 URL을 지웁니다. purge_page_from_cache(kwargs['instance']) # 수신자 등록 pre_page_move.connect(clear_old_page_urls_from_cache) ``` (page_slug_changed)= ## `page_slug_changed` 이 시그널은 슬러그 변경 사항이 게시될 때 `Page` 에서 발생합니다. 이 시그널에서 다음 인수가 발생합니다. - `sender` - 페이지 `class`. - `instance` - 업데이트된(및 저장된) 특정 `Page` 인스턴스. - `instance_before` - 변경 사항이 저장되기 **전** 특정 `Page` 인스턴스의 복사본. ## `workflow_submitted` 이 시그널은 페이지가 워크플로에 제출될 때 `WorkflowState` 에서 발생합니다. - `sender` - `WorkflowState` - `instance` - 특정 `WorkflowState` 인스턴스. - `user` - 워크플로를 제출한 사용자 - `kwargs` - `workflow_submitted.send()` 에 전달된 다른 인수. ## `workflow_rejected` 이 시그널은 페이지가 워크플로에서 거부될 때 `WorkflowState` 에서 발생합니다. - `sender` - `WorkflowState` - `instance` - 특정 `WorkflowState` 인스턴스. - `user` - 워크플로를 거부한 사용자 - `kwargs` - `workflow_rejected.send()` 에 전달된 다른 인수. ## `workflow_approved` 이 시그널은 페이지의 워크플로가 성공적으로 완료될 때 `WorkflowState` 에서 발생합니다. - `sender` - `WorkflowState` - `instance` - 특정 `WorkflowState` 인스턴스. - `user` - 워크플로를 마지막으로 승인한 사용자 - `kwargs` - `workflow_approved.send()` 에 전달된 다른 인수. ## `workflow_cancelled` 이 시그널은 페이지의 워크플로가 취소될 때 `WorkflowState` 에서 발생합니다. - `sender` - `WorkflowState` - `instance` - 특정 `WorkflowState` 인스턴스. - `user` - 워크플로를 취소한 사용자 - `kwargs` - `workflow_cancelled.send()` 에 전달된 다른 인수. ## `task_submitted` 이 시그널은 페이지가 작업에 제출될 때 `TaskState` 에서 발생합니다. - `sender` - `TaskState` - `instance` - 특정 `TaskState` 인스턴스. - `user` - 페이지를 작업에 제출한 사용자 - `kwargs` - `task_submitted.send()` 에 전달된 다른 인수. ## `task_rejected` 이 시그널은 페이지가 작업에서 거부될 때 `TaskState` 에서 발생합니다. - `sender` - `TaskState` - `instance` - 특정 `TaskState` 인스턴스. - `user` - 작업을 거부한 사용자 - `kwargs` - `task_rejected.send()` 에 전달된 다른 인수. ## `task_approved` 이 시그널은 페이지의 작업이 승인될 때 `TaskState` 에서 발생합니다. - `sender` - `TaskState` - `instance` - 특정 `TaskState` 인스턴스. - `user` - 작업을 승인한 사용자 - `kwargs` - `task_approved.send()` 에 전달된 다른 인수. ## `task_cancelled` 이 시그널은 페이지의 작업이 취소될 때 `TaskState` 에서 발생합니다. - `sender` - `TaskState` - `instance` - 특정 `TaskState` 인스턴스. - `user` - 작업을 취소한 사용자 - `kwargs` - `task_cancelled.send()` 에 전달된 다른 인수. ## `copy_for_translation_done` 이 시그널은 번역 가능한 모델 또는 페이지가 새 로케일로 복사될 때(번역됨) `CopyForTranslationAction` 또는 `CopyPageForTranslationAction` 에서 발생합니다. 번역 가능한 모델은 [TranslatableMixin](wagtail.models.TranslatableMixin)을 구현하는 모델입니다. - `sender` - `CopyForTranslationAction` 또는 `CopyPageForTranslationAction` - `source_obj` - 원본 객체 - `target_obj` - 새 로케일의 원본 객체 복사본 (init_new_page_signal)= ## `init_new_page` 이 시그널은 관리자 인터페이스에서 새 페이지가 초기화될 때 `CreateView` 에서 발생합니다. 즉, 사용자가 새 페이지를 만들기 위한 폼으로 이동할 때 발생합니다. 기본값이 충분하지 않을 때 페이지 폼을 프로그래밍 방식으로 미리 채우는 데 유용합니다. - `sender` - `CreateView` - `page` - 새 페이지 인스턴스 - `parent_page` - 새 페이지의 부모 페이지 다음은 이 시그널을 사용하여 페이지의 부모 제목을 접두사로 사용하여 새 페이지의 제목을 미리 채우는 방법의 예입니다. ```python from wagtail.signals import init_new_page def prepopulate_page(sender, page, parent, **kwargs): if parent: page.title = f"{parent.title}: 새 페이지 제목" init_new_page.connect(prepopulate_page) ``` 페이지 생성 및 편집 폼의 더 복잡한 사용자 지정에 대한 자세한 내용은 [](custom_edit_handler_forms)를 참조하십시오.