2016-03-29 31 views
0

目前正在使用TurboGears2ToscaWidgets2的项目。我有几个静态字段,名称,日期和联系人信息的表单设置。在这个表单里面,我添加了一个子表单,用户可以在GrowingGridLayout中动态添加多个条目。表格,布局和提交信息都很好,但我很难弄清楚如何从GrowingGridLayout中获取信息以便保存。猜猜要点是,我怎么知道表格中包含了多少条目?ToscaWidgets2从GrowingGridLayout捕获数据

包括为形式的代码:

class OnrampForm(twf.Form): 
    title = "Onramp Submission Form" 

    class child(twd.CustomisedTableForm): 
     onramp_name = twf.TextField(validator=twc.Required) 

     class Destinations (twd.GrowingGridLayout): 
      environment = twf.SingleSelectField(label='Environment', validator=twc.Validator(required=True), options=[<OPTIONS>]) 
      location = twf.SingleSelectField(validator=twc.Required, label='Location', options=[<OPTIONS>]) 
      jms_type = twf.SingleSelectField(label='JMS Type', validator=twc.Validator(required=True), options=[<OPTIONS>]) 
      subscription_type = twf.SingleSelectField(label='Subscription Type', validator=twc.Validator(required=True), options=[<OPTIONS>]) 

     onramp_status = twf.SingleSelectField(prompt_text='Status', options=['Initial Release', 'Update'], validator=twc.Required) 
     current_date = datetime.date.today() 
     need_by_date = twd.CalendarDatePicker(validators=[twc.Required, twc.DateTimeValidator]) 
     need_by_date.default = current_date + datetime.timedelta(days=30) 
     organization = twf.TextField(validator=twc.Required) 
     poc_name = twf.TextField(validator=twc.Required) 
     poc_email = twf.EmailField(validator=twc.EmailValidator) 
     poc_phone = twf.TextField(validator=twc.Required) 
     poc_address = twf.TextField() 
     poc_city = twf.TextField() 
     poc_state = twf.TextField() 
     onramp_form = twf.FileField() 
     submit = twf.SubmitButton(value="Submit") 

    action = "/print_args" 
    submit = "" 

回答

0

如果您对控制器的形式@validate是你应得的数据为Destination参数,它应该是一个字典列表。

另外我只注意到你有两个嵌套窗体,这可能会混淆TW2。你想要做的可能是OnrampForm继承CustomisedForm,然后有child继承TableLayout。请参阅http://turbogears.readthedocs.org/en/latest/cookbook/TwForms.html#displaying-forms

PS:请注意,need_by_date.default = current_date + datetime.timedelta(days=30)将始终在服务器启动后30天返回,因为您实际存储current_date = datetime.date.today()类变量,该变量在模块导入时不会再计算。

您应该使用default = Deferred(lambda: datetime.date.today() + datetime.timedelta(days=30))来实现该目标