[python] Flask-WTF에서 폼을 동적으로 생성할 때 필드에 따라 유효성 검사를 적용하는 방법은 어떻게 되나요?

Flask-WTF는 WTForms라는 폼 라이브러리를 Flask와 통합하여 사용할 수 있도록 해주는 확장 기능입니다. 이를 사용하면 폼을 쉽게 생성하고 유효성 검사를 할 수 있습니다.

동적으로 폼을 생성하는 경우, 필드마다 다른 유효성 검사를 적용하려면 DynamicFormField라는 확장 클래스를 만들어 사용할 수 있습니다. 이 클래스를 사용하면 필드마다 유효성 검사 함수를 적용할 수 있게 됩니다.

먼저, 필드마다 다른 유효성 검사 함수를 작성해야 합니다. 이 함수는 해당 필드에 대한 유효성 검사를 수행하고, 검사를 통과하지 못할 경우 ValidationError를 발생시킵니다. 예를 들어, 이메일 필드를 검사하는 함수는 아래와 같이 작성할 수 있습니다.

from wtforms import ValidationError

def email_validation(form, field):
    email = field.data
    if not email.endswith('@example.com'):
        raise ValidationError('올바른 이메일 주소를 입력하세요.')

def phone_validation(form, field):
    phone = field.data
    if not phone.isnumeric() or len(phone) != 10:
        raise ValidationError('올바른 전화번호를 입력하세요.')

이제 DynamicFormField 클래스를 작성해야 합니다. 이 클래스는 WTForms의 Field를 상속받아 필요한 유효성 검사 함수를 적용합니다. 아래는 DynamicFormField 클래스의 예시입니다.

from wtforms import StringField
from flask_wtf import FlaskForm

class DynamicFormField(StringField):
    def __init__(self, label=None, validators=None, **kwargs):
        super(DynamicFormField, self).__init__(label, validators, **kwargs)
        self.validators.append(email_validation)  # 필요한 유효성 검사 함수 추가
        self.validators.append(phone_validation)  # 필요한 유효성 검사 함수 추가

이제 DynamicFormField를 사용하여 동적으로 폼을 생성할 수 있습니다. 예를 들어, 이메일과 전화번호 필드가 포함된 폼을 생성하려면 아래와 같이 작성할 수 있습니다.

class MyForm(FlaskForm):
    email = DynamicFormField('이메일 주소')
    phone = DynamicFormField('전화번호')

@app.route('/form', methods=['GET', 'POST'])
def form():
    form = MyForm()
    if form.validate_on_submit():
        # 폼이 제출되었고, 유효성 검사를 통과한 경우의 처리
        pass
    return render_template('form.html', form=form)

위의 예시에서는 이메일 필드와 전화번호 필드에 각각 email_validation과 phone_validation 함수를 적용했습니다. 이렇게 필드마다 다른 유효성 검사를 적용할 수 있습니다.

참고 문서: