[python] Flask-WTF에서 폼을 동적으로 생성할 때 필드에 따른 유효성 검사를 어떻게 할 수 있나요?

Flask-WTF는 Flask를 기반으로한 웹 애플리케이션 개발에 유용한 라이브러리입니다. 이 라이브러리를 사용하여 동적으로 폼을 생성하고 각 필드에 대한 유효성 검사를 추가할 수 있습니다.

먼저, FormFieldFieldList 클래스를 사용하여 동적인 필드를 가지는 폼을 생성합니다. FormField는 다른 폼 클래스의 인스턴스를 포함하는 필드를 생성하고, FieldList는 동일한 필드를 반복해서 생성하는 필드를 생성합니다.

아래는 Flask-WTF를 사용하여 동적 폼과 필드 유효성 검사를 구현한 예제 코드입니다.

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, FormField, FieldList, SubmitField
from wtforms.validators import DataRequired, Length

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'

class DynamicForm(FlaskForm):
    field1 = StringField('Field 1', validators=[DataRequired()])
    field2 = IntegerField('Field 2', validators=[DataRequired(), Length(min=0, max=100)])

class MainForm(FlaskForm):
    dynamic_fields = FieldList(FormField(DynamicForm))

    submit = SubmitField('Submit')

@app.route('/', methods=['GET', 'POST'])
def index():
    form = MainForm()

    if form.validate_on_submit():
        for sub_form in form.dynamic_fields.data:
            if not sub_form.get('field1') or not sub_form.get('field2'):
                # 필수 필드가 비어있는지 확인
                flash('All fields are required', 'error')
                return redirect(url_for('index'))

    return render_template('index.html', form=form)

if __name__ == '__main__':
    app.run()

위의 코드에서 DynamicForm 클래스는 동적으로 생성되는 폼입니다. 이 폼은 field1field2라는 필드를 가지고 있으며, 각 필드에는 DataRequiredLength 유효성 검사가 추가되어 있습니다.

MainForm 클래스는 동적 필드를 가지는 폼입니다. dynamic_fields 필드는 DynamicForm 클래스의 인스턴스를 여러 개 가지며, FieldList를 사용하여 동적으로 필드를 반복해서 생성합니다.

폼 제출 시 form.validate_on_submit() 메서드를 사용하여 각 동적 폼의 유효성을 검사할 수 있습니다. 필수 필드인 field1field2가 비어있는지 확인하여 유효성 검사를 수행하고, 필드가 비어있으면 적절한 오류 메시지를 표시합니다.

이제 해당 코드를 참고하여 Flask-WTF를 사용하여 동적 폼과 필드 유효성 검사를 구현할 수 있습니다.