沒有必要建立任何東西(至少在服務器上側) - WTForms已經支持你所需要的 - 它叫他們"field enclosures"。您正在尋找的行爲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驗證相應的字段,給用戶的選擇:
# 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)
當你在打電話form.validate()
服務器端將根據需求自動檢查字段,錯誤將被適當地填充,以便您可以將它們呈現在客戶端。
在客戶端創建新字段很簡單,只要您命名爲using the same naming convention it uses - 即field.short_name + '-' + index
,WTForms將在後端選擇它們。
Flask讓你可以很容易地迭代'POST'數據。你應該閱讀一下文檔,看看是否有幫助。 – Blender 2012-07-09 20:32:08
是的,我對此很熟悉。我主要關心的是如果某些事情弄糟了,返回的數據。 – Pwnna 2012-07-09 20:35:43
根據收到的服務器返回的信息,客戶端不會丟失它,您可以使用Flash消息(適用於從服務器到客戶端的一次性'post')。 – darkphoenix 2012-07-09 20:53:10