2012-07-09 39 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