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",
]
사용법¶
TypedTableBlock 은 wagtail.contrib.typed_table_block.blocks 모듈에서 가져와 StreamField 정의 내에서 사용할 수 있습니다. StructBlock 및 StreamBlock 과 마찬가지로 자식 블록으로 사용할 (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