스니펫에 대한 관리자 뷰 사용자 지정

각 스니펫 모델에 대한 관리자 뷰에 대한 추가 사용자 지정은 사용자 지정 SnippetViewSet 클래스를 통해 달성할 수 있습니다. SnippetViewSet 은 스니펫별 속성이 기본적으로 제공되는 ModelViewSet 의 서브클래스입니다. 따라서 사용자 지정 목록 뷰(예: 사용자 지정 열 및 필터 추가), 사용자 지정 메뉴 항목 생성 등 ModelViewSet 에서 제공하는 것과 동일한 사용자 지정을 지원합니다.

계속하기 전에 스니펫 등록에 설명된 대로 register_snippet 을 데코레이터 대신 함수로 사용하여 스니펫 모델을 등록했는지 확인하십시오.

데모를 위해 다음 Member 모델과 MemberFilterSet 클래스를 고려해 봅시다.

# models.py
from django.db import models
from wagtail.admin.filters import WagtailFilterSet


class Member(models.Model):
    class ShirtSize(models.TextChoices):
        SMALL = "S", "작은"
        MEDIUM = "M", "중간"
        LARGE = "L", "큰"
        EXTRA_LARGE = "XL", "매우 큰"

    name = models.CharField(max_length=255)
    shirt_size = models.CharField(max_length=5, choices=ShirtSize.choices, default=ShirtSize.MEDIUM)

    def get_shirt_size_display(self):
        return self.ShirtSize(self.shirt_size).label

    get_shirt_size_display.admin_order_field = "shirt_size"
    get_shirt_size_display.short_description = "크기 설명"


class MemberFilterSet(WagtailFilterSet):
    class Meta:
        model = Member
        fields = ["shirt_size"]

다음은 스니펫의 해당 SnippetViewSet 서브클래스입니다.

# wagtail_hooks.py
from wagtail.admin.panels import FieldPanel, ObjectList, TabbedInterface
from wagtail.admin.ui.tables import UpdatedAtColumn
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import SnippetViewSet

from myapp.models import Member, MemberFilterSet


class MemberViewSet(SnippetViewSet):
    model = Member
    icon = "user"
    list_display = ["name", "shirt_size", "get_shirt_size_display", UpdatedAtColumn()]
    list_per_page = 50
    copy_view_enabled = False
    inspect_view_enabled = True
    admin_url_namespace = "member_views"
    base_url_path = "internal/member"
    filterset_class = MemberFilterSet
    # 또는 filterset_class 대신 다음을 사용할 수 있습니다.
    # list_filter = ["shirt_size"]
    # 또는
    # list_filter = {"shirt_size": ["exact"], "name": ["icontains"]}

    edit_handler = TabbedInterface([
        ObjectList([FieldPanel("name")], heading="세부 정보"),
        ObjectList([FieldPanel("shirt_size")], heading="기본 설정"),
    ])

register_snippet(MemberViewSet)

아이콘

SnippetViewSeticon 속성을 정의하여 이 스니펫 유형에 대해 관리자 전체에서 사용되는 아이콘을 지정할 수 있습니다. iconWagtail 아이콘 라이브러리에 등록되어야 합니다. icon 이 설정되지 않으면 기본 "snippet" 아이콘이 사용됩니다.

URL 네임스페이스 및 기본 URL 경로

url_namespace 속성을 재정의하여 뷰의 URL 패턴에 대한 사용자 지정 URL 네임스페이스를 사용할 수 있습니다. 설정되지 않으면 wagtailsnippets_{app_label}_{model_name} 으로 기본 설정됩니다. 한편, url_prefix 를 재정의하면 Wagtail 관리자 URL에 대한 기본 URL 경로를 사용자 지정할 수 있습니다. 설정되지 않으면 snippets/app_label/model_name 으로 기본 설정됩니다.

유사한 URL 사용자 지정은 chooser_admin_url_namespace, chooser_base_url_path, get_chooser_admin_url_namespace(), get_chooser_admin_base_path() 를 통해 스니펫 선택기 뷰에서도 가능합니다.

목록 뷰

SnippetViewSet 에서 사용할 수 있는 다양한 속성을 통해 사용자 지정 열, 필터, 페이지 매김 등을 추가하여 목록 뷰를 사용자 지정할 수 있습니다. 자세한 내용은 ModelViewSet 에 대한 목록 뷰 사용자 지정을 참조하십시오.

또한 get_queryset() 메서드를 재정의하여 목록 뷰의 기본 쿼리셋을 사용자 지정할 수 있습니다.

복사 뷰

복사 뷰는 기본적으로 활성화되어 있으며 모델에 대한 ‘add’ 권한이 있는 사용자가 액세스할 수 있습니다. 비활성화하려면 copy_view_enabledFalse 로 설정하십시오. 자세한 내용은 ModelViewSet 에 대한 복사 뷰 사용자 지정을 참조하십시오.

검사 뷰

검사 뷰는 대부분의 모델에 유용하지 않으므로 기본적으로 비활성화되어 있습니다. 활성화하려면 inspect_view_enabledTrue 로 설정하십시오. 자세한 내용은 ModelViewSet 에 대한 검사 뷰 사용자 지정을 참조하십시오.

템플릿

템플릿 사용자 지정은 ModelViewSet 과 동일하게 작동하지만, template_prefix 는 기본적으로 wagtailsnippets/snippets/ 입니다. 자세한 내용은 ModelViewSet 에 대한 템플릿 사용자 지정을 참조하십시오.

메뉴 항목

기본적으로 스니펫 모델을 등록하면 사이드바 메뉴에 “스니펫” 메뉴 항목이 추가됩니다. 그러나 add_to_admin_menuTrue 로 설정하여 스니펫 모델이 사이드바 메뉴에 자체 최상위 메뉴 항목을 갖도록 구성할 수 있습니다. 자세한 내용은 ModelViewSet 에 대한 메뉴 사용자 지정을 참조하십시오.

add_to_admin_menuTrue 로 설정된 사용자 지정 SnippetViewSet 서브클래스의 예시:

from wagtail.snippets.views.snippets import SnippetViewSet


class AdvertViewSet(SnippetViewSet):
    model = Advert
    icon = "crosshairs"
    menu_label = "광고"
    menu_name = "adverts"
    menu_order = 300
    add_to_admin_menu = True

여러 스니펫 모델을 SnippetViewSetGroup 을 사용하여 단일 메뉴 항목 아래에 그룹화할 수도 있습니다. SnippetViewSet 클래스에 model 속성을 설정한 다음 각 개별 모델 또는 뷰셋 대신 SnippetViewSetGroup 서브클래스를 등록하여 이를 수행할 수 있습니다.

from wagtail.snippets.views.snippets import SnippetViewSet, SnippetViewSetGroup


class AdvertViewSet(SnippetViewSet):
    model = Advert
    icon = "crosshairs"
    menu_label = "광고"
    menu_name = "adverts"


class ProductViewSet(SnippetViewSet):
    model = Product
    icon = "desktop"
    menu_label = "제품"
    menu_name = "banners"


class MarketingViewSetGroup(SnippetViewSetGroup):
    items = (AdvertViewSet, ProductViewSet)
    menu_icon = "folder-inverse"
    menu_label = "마케팅"
    menu_name = "marketing"


# 여러 SnippetViewSet 클래스를 그룹화하기 위해 SnippetViewSetGroup 클래스를 사용하는 경우,
# 각 스니펫 모델 또는 뷰셋을 개별적으로 등록할 필요가 없습니다.
register_snippet(MarketingViewSetGroup)

기본적으로 사이드바 “스니펫” 메뉴 항목은 자체 메뉴 항목으로 구성되지 않은 스니펫 모델만 표시합니다. 모든 스니펫 모델에 자체 메뉴 항목이 있는 경우 “스니펫” 메뉴 항목은 표시되지 않습니다. 이 동작은 WAGTAILSNIPPETS_MENU_SHOW_ALL 설정을 사용하여 변경할 수 있습니다.

뷰셋을 사용자 지정하는 데 사용할 수 있는 다양한 추가 속성이 있습니다. SnippetViewSet 을 참조하십시오.