폼 위젯 클라이언트 측 API¶
StreamField 편집 인터페이스가 폼 필드를 동적으로 생성하려면 StreamField 블록 내에서 사용되는 모든 Django 폼 위젯에 위젯이 클라이언트 측에서 렌더링되고 데이터로 채워지는 방법과 해당 필드에서 데이터를 추출하는 방법을 정의하는 JavaScript 구현이 함께 제공되어야 합니다. Wagtail은 django.forms.widgets.Input, django.forms.Textarea, django.forms.Select 및 django.forms.RadioSelect 에서 상속하는 위젯에 대해 이 구현을 제공합니다. 다른 위젯 유형 또는 사용자 지정 클라이언트 측 동작이 필요한 위젯 유형의 경우 자체 구현을 제공해야 합니다.
이 구현은 Stimulus에 의해 구동되거나 더 깊은 통합을 위해 telepath를 활용할 수 있습니다.
telepath 라이브러리는 Python 위젯 클래스와 해당 JavaScript 구현 간의 매핑을 설정하는 데 사용됩니다. 매핑을 만들려면 wagtail.widget_adapters.WidgetAdapter 의 서브클래스를 정의하고 wagtail.telepath.register 로 등록합니다.
from wagtail.telepath import register
from wagtail.widget_adapters import WidgetAdapter
class FancyInputAdapter(WidgetAdapter):
# 클라이언트 측에 등록된 것과 일치하는 식별자
js_constructor = 'myapp.widgets.FancyInput'
# 클라이언트 측 객체에 전달되는 인수
def js_args(self, widget):
return [
# 일반적으로 위젯의 HTML 표현을 포함하는 인수
# 및 __NAME__ 및 __ID__ 플레이스홀더로 렌더링된 레이블 ID,
# 클라이언트 측 render() 메서드에서 사용
widget.render('__NAME__', None, attrs={'id': '__ID__'}),
widget.id_for_label('__ID__'),
widget.extra_options,
]
class Media:
# 위젯 자체 미디어 외에 필요한 JS / CSS 포함;
# 일반적으로 클라이언트 측 어댑터 정의를 포함합니다.
js = ['myapp/js/fancy-input-adapter.js']
register(FancyInputAdapter(), FancyInput)
위젯 인스턴스와 연결된 JavaScript 객체는 단일 메서드를 제공해야 합니다.
- render(placeholder, name, id, initialState)¶
이 위젯의 복사본을 현재 페이지에 렌더링하고 필요한 초기화를 수행합니다.
- 인수:
placeholder – 위젯의 HTML로 대체될 HTML DOM 요소입니다.
name – 입력 요소의
name속성으로 사용될 문자열입니다. 여러 입력 요소를 사용하는 위젯(및 최종 값으로 다시 정렬하기 위한 서버 측 논리가 있는 위젯)의 경우, 접두사로 처리될 수 있으며, 추가 요소는 대시로 구분됩니다. (예를 들어,name이'person-0'인 경우 위젯은person-0-first_name및person-0-surname이름의 요소를 생성할 수 있으며, 폼의 다른 필드 이름과 충돌할 위험이 없습니다.)id – 입력 요소의
id속성으로 사용될 문자열입니다.name과 마찬가지로 추가 식별자의 접두사로 처리될 수 있습니다.initialState – 위젯을 채울 초기 데이터입니다.
위젯의 상태는 종종 폼 필드의 값과 동일하지만, 폼 제출에서 처리되는 것 이상의 추가 데이터를 포함할 수 있습니다. 예를 들어, 페이지 선택기 위젯은 페이지 ID를 포함하는 숨겨진 폼 필드와 페이지 제목을 표시하는 읽기 전용 레이블로 구성됩니다. 이 경우 페이지 ID만으로는 위젯을 렌더링하기에 충분한 정보를 제공하지 않으므로 상태는 id 및 title 항목이 있는 사전으로 정의됩니다.
render 에서 반환된 값은 이 위젯 인스턴스의 데이터에 액세스할 수 있는 ‘바인딩된 위젯’ 객체입니다. 이 객체는 다음 속성 및 메서드를 구현해야 합니다.
- idForLabel¶
이 위젯을 참조하는 레이블의
for속성으로 사용할 HTML ID 또는 적절한 HTML 요소가 없는 경우 null입니다.
- getValue()¶
이 위젯의 제출 가능한 값(일반적으로 입력 요소의 값과 동일)을 반환합니다.
- getState()¶
이 위젯의 내부 상태를
render메서드의initialState인수로 전달하기에 적합한 값으로 반환합니다.
- setState(newState)¶
선택 사항: 이 위젯의 내부 상태를 전달된 값으로 업데이트합니다.
- focus(soft)¶
이 위젯에 브라우저의 포커스를 설정하여 입력 이벤트를 수신하도록 합니다. 포커스 개념이 없는 위젯은 아무것도 하지 않아야 합니다.
soft가 true인 경우, 이는 포커스 이벤트가 사용자 작업에 의해 명시적으로 트리거되지 않았음을 나타냅니다(예: 새 블록이 삽입되고 사용자의 편의를 위해 첫 번째 필드에 포커스가 맞춰질 때). 이 경우 위젯은 모달 열기와 같은 방해적인 UI 작업을 수행하지 않아야 합니다.