스니펫 등록¶
스니펫은 register_snippet 을 데코레이터 또는 함수로 사용하여 등록할 수 있습니다. 후자가 권장되지만, 데코레이터는 편의성과 하위 호환성을 위해 제공됩니다.
데코레이터로 @register_snippet 사용¶
스니펫은 Django 모델에 @register_snippet 데코레이터를 사용하여 등록할 수 있습니다. 다음은 스니펫 모델 예시입니다.
from django.db import models
from wagtail.admin.panels import FieldPanel
from wagtail.snippets.models import register_snippet
# ...
@register_snippet
class Advert(models.Model):
url = models.URLField(null=True, blank=True)
text = models.CharField(max_length=255)
panels = [
FieldPanel("url"),
FieldPanel("text"),
]
def __str__(self):
return self.text
Advert 모델은 기본 Django 모델 클래스를 사용하며 url 및 text 의 두 속성을 정의합니다. 편집 인터페이스는 Page 파생 모델에 제공되는 인터페이스와 매우 유사하며, panels(또는 edit_handler) 속성에 필드가 할당됩니다. 추가로 구성되지 않는 한 스니펫은 여러 필드 탭을 사용하지 않으며 “초안으로 저장” 또는 “중재를 위해 제출” 기능도 제공하지 않습니다.
@register_snippet 은 Wagtail에 모델을 스니펫으로 처리하도록 지시합니다. panels 목록은 스니펫 편집 페이지에 표시할 필드를 정의합니다. def __str__(self): 를 통해 클래스의 문자열 표현을 제공하는 것도 중요합니다. 이렇게 하면 Wagtail 관리자에 스니펫 객체가 나열될 때 의미가 있습니다.
함수로 register_snippet 사용¶
@register_snippet 데코레이터가 편리하지만, 스니펫을 등록하는 권장 방법은 wagtail_hooks.py 파일에서 register_snippet 을 함수로 사용하는 것입니다. 예를 들어:
# myapp/wagtail_hooks.py
from wagtail.snippets.models import register_snippet
from myapp.models import Advert
register_snippet(Advert)
이러한 방식으로 스니펫을 등록하면 나중에 사용자 지정 SnippetViewSet 클래스를 사용하여 추가 사용자 지정을 추가할 수 있습니다. 또한 Django 모델과 Wagtail 특정 관심사 간의 더 나은 분리를 제공합니다. 예를 들어, 모델 클래스에 panels 또는 edit_handler 를 정의하는 대신 SnippetViewSet 클래스에 정의할 수 있습니다.
# myapp/wagtail_hooks.py
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import SnippetViewSet
from myapp.models import Advert
class AdvertViewSet(SnippetViewSet):
model = Advert
panels = [
FieldPanel("url"),
FieldPanel("text"),
]
# 모델 클래스에 @register_snippet을 데코레이터로 사용하는 대신,
# register_snippet을 함수로 사용하여 스니펫을 등록하고
# 사용자 지정 SnippetViewSet 서브클래스를 전달합니다.
register_snippet(AdvertViewSet)
패널을 더 사용자 지정하려면 get_edit_handler() 메서드를 재정의할 수 있습니다. 추가 사용자 지정은 스니펫에 대한 관리자 뷰 사용자 지정에서 나중에 설명합니다.