[python] Flask-WTF에서 입력 폼의 템플릿을 커스터마이징하는 방법은 어떻게 되나요?

가장 간단한 방법은 WTForms의 기본 템플릿을 사용하여 폼 요소를 표시하는 것입니다. 먼저, 폼 클래스를 정의하고 필요한 필드를 추가합니다. 그런 다음, 템플릿에서 폼 필드를 렌더링하면 됩니다.

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class MyForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    submit = SubmitField('Submit')

위의 코드는 이름을 입력 받는 필드와 제출 버튼을 가진 간단한 폼을 정의하는 예시입니다.

Jinja2의 템플릿 엔진을 통해 이 폼을 렌더링합니다. 폼을 렌더링하기 위해 폼 인스턴스를 템플릿에 전달해야 합니다. 이를 위해 render_template 함수를 사용할 수 있습니다. 또한, 필드를 개별적으로 렌더링할 수도 있습니다.


<!-- 폼 전체를 렌더링하는 예시 -->
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block content %}
    <h1>My Form</h1>
    <form method="POST" action="{{ url_for('submit_form') }}">
        {{ form.hidden_tag() }}
        {{ wtf.form_field(form.name) }}
        {{ wtf.form_field(form.submit) }}
    </form>
{% endblock %}

위의 코드에서는 bootstrap 템플릿을 사용하여 폼을 렌더링하였습니다.

또 다른 방법은 커스텀 템플릿 파일을 작성하는 것입니다. WTForms는 기본적으로 bootstrap 템플릿을 제공하지만, 이를 확장하여 나만의 템플릿을 작성할 수도 있습니다. 이를 위해서는 Jinja2의 상속 기능을 사용하고 필요한 블록들을 재정의하면 됩니다.


<!-- 커스텀 템플릿 예시 -->
{% extends "base.html" %}

{% block content %}
    <h1>My Form</h1>
    <form method="POST" action="{{ url_for('submit_form') }}">
        {{ form.hidden_tag() }}
        <div>
            {{ form.name.label }}
            {{ form.name(class='form-control') }}
            {% if form.name.errors %}
                <ul class="errors">
                    {% for error in form.name.errors %}
                        <li>{{ error }}</li>
                    {% endfor %}
                </ul>
            {% endif %}
        </div>
        <div>
            {{ form.submit(class='btn btn-primary') }}
        </div>
    </form>
{% endblock %}

위의 예시는 form-control 클래스를 사용하여 입력 필드를 스타일링하고, 에러 메시지를 표시하는 코드입니다.

이처럼 Flask-WTF에서 폼 템플릿을 커스터마이징하는 방법은 다양하지만, 주어진 예시를 참고하면 시작할 수 있을 것입니다.

참고 문서: