2012-07-09 42 views
6

标题真的不说,因为我有麻烦总结问题。所以这里去长解释:如何获得一个形式与重复元素好

比方说,我添加多个联系人的信息,我有这些领域:

  • 接触联系的
  • 方法(电子邮件,电话号码的名称,即时消息)
    • 如果电子邮件:显示的电子邮件字段(比方说这个领域存在)
    • 如果电话号码:显示一个电话号码字段
    • 如果即时消息:翔W A文本字段

所以马上蝙蝠,我会被需要JavaScript的网页本身上完成这个(添加添加或删除联系人字段),我很确定用。然而,由于我可以添加多个联系人(并且作为软件开发人员,我不知道用户想要添加多少联系人,可能是1,10或100)

所以我最大的问题是如何我要去构造每个领域的名字。我应该把所有东西都扔进像names[],contactmethods[]这样的东西,然后按顺序访问东西,或者有更好的解决方案。此外,如果服务器开始验证这些信息,并发现一些格式不正确的信息,我希望能够将客户端发送到服务器的数据发送回客户端,所以它们不会丢失他们所进入的一切。我将如何轻松完成这个任务?

一些背景资料: 目前使用的技术(这是相关的):

  • jQuery的
  • WTForms
+0

Flask让你可以很容易地迭代'POST'数据。你应该阅读一下文档,看看是否有帮助。 – Blender 2012-07-09 20:32:08

+0

是的,我对此很熟悉。我主要关心的是如果某些事情弄糟了,返回的数据。 – Pwnna 2012-07-09 20:35:43

+0

根据收到的服务器返回的信息,客户端不会丢失它,您可以使用Flash消息(适用于从服务器到客户端的一次性'post')。 – darkphoenix 2012-07-09 20:53:10

回答

5

没有必要建立任何东西(至少在服务器上侧) - 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将在后端选择它们。

+0

如果我有另一个选择字段,在某些选项下,将电话字段放入2个文本字段中以解析为元组,甚至将电话字段放入选择字段中,该怎么办? – Pwnna 2012-07-15 16:09:07