2010-03-16 46 views
1

我一直在試圖添加一些複選框在塔掛馬克。但是我不知道如何在控制器中獲取它們的值。它似乎只能得到複選框的第一個值。我嘗試使用表單編碼,但我有幾個錯誤。有沒有更簡單的方法來做到這一點?複選框與掛架

感謝

回答

0

我假設,「我只能拿到第一價值」意味着你已經取得了一系列的複選框與「名字」你的表格內屬性的值相同?現在

,如果是這樣的話,你就想要基於框是否被選中或不布爾值的列表,你需要做兩件事情:

首先,當你定義你的表單元素使用表單編碼在你的複選框上,設置它使得複選框元素上的缺失值返回'False'。這樣,除非複選框爲「on」,否則瀏覽器不會發送值,因此驗證會將缺少的值強制爲False。

 

    class Registration(formencode.Schema): 
     box = formencode.validators.StringBoolean(if_missing=False) 
 

接下來,假設您想要一個返回的列表,您將無法將所有元素命名爲相同。不過,主塔支持嵌套結構。看看formencode.variabledecode.NestedVariables。簡而言之,您需要定義一個NestedVariables實例作爲您的類屬性之一,並且您的表單'name'屬性需要更改以包含顯式索引。

編輯..這裏是我做了真正的快速完整的例子:

 

import logging 
import pprint 

import formencode 
from pylons import request, response, session, tmpl_context as c, url 
from pylons.controllers.util import abort, redirect 
from pylons.decorators import validate 

from testproj.lib.base import BaseController, render 

log = logging.getLogger(__name__) 

class CheckList(formencode.Schema): 
    box = formencode.validators.StringBoolean(if_missing=False) 
    hidden = formencode.validators.String() 

class EnclosingForm(formencode.Schema): 
    pre_validators = [formencode.NestedVariables()] 
    boxes = formencode.ForEach(CheckList()) 

class MyformController(BaseController): 

    def index(self): 
     schema = EnclosingForm() 
     v = schema.to_python(dict(request.params)) 
     # Return a rendered template 
     #return render('/myform.mako') 
     # or, return a response 
     response.content_type = 'text/plain' 
     return pprint.pformat(v) 

 

然後查詢字符串?

 
boxes-0.box=true&boxes-0.hidden=hidden&boxes-1.box=true& 
boxes-1.hidden=hidden&boxes-2.hidden=hidden

最後,響應:

 
{'boxes': [{'box': True, 'hidden': u'hidden'}, 
      {'box': True, 'hidden': u'hidden'}, 
      {'box': False, 'hidden': u'hidden'}]} 

HTH

+0

隱藏字段確保NestedVariables看到存在被認爲是存在的形式。儘管如此,如果你只是處理複選框的集合,你可能只能讀取查詢字符串並自己進行挖掘。 – McJeff 2010-03-16 19:52:28