将默认值设置为视图web2py中的表字段

时间:2013-11-16 13:01:00

标签: python web2py

我的应用程序有以下代码:

db.define_table('event',
   Field('name'),
   Field('date','date'),
   Field('location'),
   format='%(name)s')

db.define_table('presentations',
   Field('event', db.event),
   Field('title'),
   Field('description'),
   Field('level'))

db.define_table('presenters',
   Field('name'),
   Field('company'),
   Field('resume'), 
   Field('avatar','upload),
   format='%(name)s')

db.define_table('presentations_presenters',
   Field('presentation', db.presentation),
   Field('presenter', db.presenters))

然后我为演示文稿创建了一个控制器:

def admpresentations():
    presentationList=db(db.presentations.event==request.vars.eventid).select()
    return dict(presentations=presentationList)

在我看来,这显示为:

{{for presentation in presentations:}}
    {{=presentation.title}}
    {{=presentation.description}}
    {{=presentation.level}}
{{pass}}

现在,我的问题是:我必须为每个演示文稿添加演示者。为此需要为presentations_presenters.presentation设置默认值,因为每个演示文稿可以有多个演示者,所以我在我的视图中尝试这个:

{{for presentation in presentations:}}
    {{=presentation.title}}
    {{=presentation.description}}
    {{=presentation.level}}

    <!--This is for setting a default value to presentation field, but doesn't work-->
    {{db.presentations_presenters.presentation.default=presentation.id}}


    <!--This creates the form, but default values are ignored-->
    {{=crud.create(db.presentations_presenters}}

{{pass}}

尝试使用SQLFORM,但我无法弄清楚如何在视图中处理它,因此数据不会写入数据库......任何线索?

修改

在最后一行:

    {{=crud.create(db.presentations_presenters}}

设置默认值确实有效,但数据不会保存到db。

2 个答案:

答案 0 :(得分:2)

crud.create()在表单中创建一个默认的_formname隐藏字段,该字段与_formkey隐藏字段结合使用,以再次保护CSRF攻击。您的代码最终会创建具有相同名称的多个表单。因此,会话中存储的_formkey值仅匹配最后创建的表单,因此由于_formkey不匹配,任何早期表单的提交都将被拒绝。要解决这个问题,您必须为每个表单指定一个唯一的名称。例如:

{{=crud.create(db.presentations_presenters,
               formname='presenters/%s' % presentation.id)}}

此外,如果您想使用SQLFORM,只需调用.process()方法在视图中处理它:

{{=SQLFORM(db.presentations_presenters).process(
       formname='presenters/%s' % presentation.id)}}

答案 1 :(得分:0)

为什么要在视图中创建表单?

在控制器中简单地创建一个SQLFORM或SQLFORM.factory并使用form。= default value设置默认值。