少なくともサーバー上で(何かを構築する必要はありませんサイド) - WTFormsは既にあなたが必要とするものをサポートしています - それは"field enclosures"と呼ばれます。あなたが上form.validate()
を呼び出すと
# CAUTION: Untested code ahead
class If(object):
def __init__(self,
parent,
run_validation=None,
extra_validators=None,
msg=None):
self.parent = parent
self.msg = msg if msg is not None else u"Invalid"
if callable(run_validation):
self.run_validation = run_validation
else:
_run_validation = lambda self, parent, form: parent.data == run_validation
self.run_validation = _run_validation
self.extra_validators = extra_validators if extra_validators is not None \
else []
def __call__(self, field, form):
parent = getattr(form, self.parent)
if self.run_validation(parent, form):
return field.validate(form, extra_validators=self.extra_validators)
:あなたが探している行動がwtforms.fields.FormField
とwtforms.fields.FieldList
class ContactForm(Form):
name = TextField("Name", validators=[Required()])
contact_type = SelectField("Contact Type",
validators=[Required()],
choices=[
("email", "Email"),
("phone", "Phone Number"),
("im", "Instant Message")
])
# `If` is a custom validator - see below
email_address = TextField("Email",
validators=[If("contact_type",
"email",
[Required(), Email()])
])
phone_number = TextField("Phone #",
validators=[If("contact_type",
"phone", [Required()])
])
im_handle = TextField("IM Handle",
validators=[If("contact_type",
"im", [Required()])
])
class SignUpForm(Form):
# Other fields go here
contacts = FieldList(FormField(ContactForm))
に発見されたあなたは、ユーザーの選択肢を与え、適切なフィールドを検証するためにcustom validatorをも必要となりますサーバー側では、フィールドが自動的に要件と照合され、エラーが適切に入力され、クライアント側でエラーが返されます。
クライアント側で新しいフィールドを作成するのは簡単です.WTFormsは、using the same naming convention it usesという名前で、つまりfield.short_name + '-' + index
の名前を付けている限り、バックエンドでそれらを取得します。
Flaskでは、簡単に 'POST'データ*を繰り返し処理できます。あなたはドキュメントを少し読んで、それが役立つかどうかを見てください。 – Blender
ええ、私はそれに精通しています。私の主な関心事は、何かが混乱した場合にデータを返すことです。 – Pwnna
クライアントがそれを失わないようにサーバーが受信したものを何度でも送り返すと、フラッシュメッセージを使用できます(サーバーからクライアントへの1回限りの「ポスト」に適しています)。 – darkphoenix