# Typed table block `typed_table_block` 모듈은 혼합 데이터 유형으로 구성된 테이블을 구축하기 위한 StreamField 블록 유형을 제공합니다. 개발자는 열 유형으로 사용할 수 있는 블록 유형(예: `RichTextBlock` 또는 `FloatBlock`) 세트를 지정할 수 있습니다. 그러면 페이지 작성자는 StreamField에 블록을 삽입하는 것과 거의 동일한 방식으로 해당 목록에서 열 유형을 선택하여 모든 크기의 테이블을 구축할 수 있습니다. 각 열 내에서 작성자는 해당 필드에 대한 표준 편집 컨트롤(예: 리치 텍스트 셀용 Draftail 편집기)을 사용하여 데이터를 입력합니다. ## 설치 `INSTALLED_APPS` 에 `"wagtail.contrib.typed_table_block"` 을 추가합니다. ```python INSTALLED_APPS = [ ... "wagtail.contrib.typed_table_block", ] ``` ## 사용법 `TypedTableBlock` 은 `wagtail.contrib.typed_table_block.blocks` 모듈에서 가져와 StreamField 정의 내에서 사용할 수 있습니다. `StructBlock` 및 `StreamBlock` 과 마찬가지로 자식 블록으로 사용할 `(name, block_type)` 튜플 목록을 허용합니다. ```python 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의 기본 내장 블록 유형을 열 유형으로 사용하는 것이 일반적으로 권장됩니다. 그러나 모든 사용자 지정 블록 유형 및 매개변수가 지원됩니다. 예를 들어, 국가 선택 드롭다운으로 구성된 '국가' 열 유형을 정의하려면: ```python 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 `` 요소로 렌더링합니다. ```html+django {% load wagtailcore_tags %} {% include_block page.body %} ``` 또는: ```html+django {% load wagtailcore_tags %} {% for block in page.body %} {% if block.block_type == 'table' %} {% include_block block %} {% else %} {# 다른 블록 유형에 대한 렌더링 #} {% endif %} {% endfor %} ``` ## 사용자 지정 유효성 검사 다른 블록과 마찬가지로 `TypedTableBlock` 의 유효성 검사 논리는 `clean` 메서드를 재정의하여 사용자 지정할 수 있습니다([StreamField 유효성 검사](streamfield_validation) 참조). 이 메서드에서 `ValidationError` 예외를 발생시키면 테이블 전체에 오류 메시지가 첨부됩니다. 개별 셀에 오류를 첨부하려면 `wagtail.contrib.typed_table_block.blocks.TypedTableBlockValidationError` 예외 클래스를 사용할 수 있습니다. 이 클래스는 표준 `non_block_errors` 인수 외에 외부 키가 행 인덱스이고 내부 키가 열 인덱스인 중첩된 사전 구조로 구성된 `cell_errors` 인수를 허용합니다. 예를 들어: ```python 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 ```