Typed table block

typed_table_block 모듈은 혼합 데이터 유형으로 구성된 테이블을 구축하기 위한 StreamField 블록 유형을 제공합니다. 개발자는 열 유형으로 사용할 수 있는 블록 유형(예: RichTextBlock 또는 FloatBlock) 세트를 지정할 수 있습니다. 그러면 페이지 작성자는 StreamField에 블록을 삽입하는 것과 거의 동일한 방식으로 해당 목록에서 열 유형을 선택하여 모든 크기의 테이블을 구축할 수 있습니다. 각 열 내에서 작성자는 해당 필드에 대한 표준 편집 컨트롤(예: 리치 텍스트 셀용 Draftail 편집기)을 사용하여 데이터를 입력합니다.

설치

INSTALLED_APPS"wagtail.contrib.typed_table_block" 을 추가합니다.

INSTALLED_APPS = [
    ...
    "wagtail.contrib.typed_table_block",
]

사용법

TypedTableBlockwagtail.contrib.typed_table_block.blocks 모듈에서 가져와 StreamField 정의 내에서 사용할 수 있습니다. StructBlockStreamBlock 과 마찬가지로 자식 블록으로 사용할 (name, block_type) 튜플 목록을 허용합니다.

from wagtail.contrib.typed_table_block.blocks import TypedTableBlock
from wagtail import blocks
from wagtail.images.blocks import ImageChooserBlock

class DemoStreamBlock(blocks.StreamBlock):
    title = blocks.CharBlock()
    paragraph = blocks.RichTextBlock()
    table = TypedTableBlock([
        ('text', blocks.CharBlock()),
        ('numeric', blocks.FloatBlock()),
        ('rich_text', blocks.RichTextBlock()),
        ('image', ImageChooserBlock())
    ])

작성자를 위해 UI를 가능한 한 간단하게 유지하려면 위와 같이 Wagtail의 기본 내장 블록 유형을 열 유형으로 사용하는 것이 일반적으로 권장됩니다. 그러나 모든 사용자 지정 블록 유형 및 매개변수가 지원됩니다. 예를 들어, 국가 선택 드롭다운으로 구성된 ‘국가’ 열 유형을 정의하려면:

table = TypedTableBlock([
    ('text', blocks.CharBlock()),
    ('numeric', blocks.FloatBlock()),
    ('rich_text', blocks.RichTextBlock()),
    ('image', ImageChooserBlock()),
    ('country', ChoiceBlock(choices=[
        ('be', '벨기에'),
        ('fr', '프랑스'),
        ('de', '독일'),
        ('nl', '네덜란드'),
        ('pl', '폴란드'),
        ('uk', '영국'),
    ])),
])

페이지 템플릿에서 {% include_block %} 태그(개별 블록 또는 StreamField 값 전체에 호출됨)는 모든 유형 테이블 블록을 HTML <table> 요소로 렌더링합니다.

{% load wagtailcore_tags %}

{% include_block page.body %}

또는:

{% load wagtailcore_tags %}

{% for block in page.body %}
    {% if block.block_type == 'table' %}
        {% include_block block %}
    {% else %}
        {# 다른 블록 유형에 대한 렌더링 #}
    {% endif %}
{% endfor %}

사용자 지정 유효성 검사

다른 블록과 마찬가지로 TypedTableBlock 의 유효성 검사 논리는 clean 메서드를 재정의하여 사용자 지정할 수 있습니다(StreamField 유효성 검사 참조). 이 메서드에서 ValidationError 예외를 발생시키면 테이블 전체에 오류 메시지가 첨부됩니다. 개별 셀에 오류를 첨부하려면 wagtail.contrib.typed_table_block.blocks.TypedTableBlockValidationError 예외 클래스를 사용할 수 있습니다. 이 클래스는 표준 non_block_errors 인수 외에 외부 키가 행 인덱스이고 내부 키가 열 인덱스인 중첩된 사전 구조로 구성된 cell_errors 인수를 허용합니다. 예를 들어:

from django.core.exceptions import ValidationError
from wagtail.blocks import IntegerBlock
from wagtail.contrib.typed_table_block.blocks import TypedTableBlock, TypedTableBlockValidationError


class LuckyTableBlock(TypedTableBlock):
    number = IntegerBlock()

    def clean(self, value):
        result = super().clean(value)
        errors = {}
        print(result.row_data)
        for row_num, row in enumerate(result['row_data']):
            row_errors = {}
            for col_num, cell in enumerate(row['values']):
                if cell == 13:
                    row_errors[col_num] = ValidationError("테이블에 숫자 13을 포함할 수 없습니다.")
            if row_errors:
                errors[row_num] = row_errors

        if errors:
            raise TypedTableBlockValidationError(cell_errors=errors)

        return result