0

使用 web2py,我无法使用 list:reference 提交(?)基于表格的表单。我有一个表db.game在其名为game_event的列之一中引用db.game_events

db.game的形式被接受,但是当我尝试访问列game_events中的数据时,使用 list:reference 引用 db.game_events 时,根据内置的 web2py 网格,该列是空的。

我可以看到信息已正确发布到数据库,在所谓的空列中显示括号中的项目。由于我使用的是内置的 web2py 网格,因此我假设行的集合是正确的,并且问题出在其他地方。

如果我在 web2py 控制台中使用“将记录添加到数据库”标题按钮(带有加号的黑色按钮),并使用那里的表单,那么 game_events 列会显示这些项目。

所以; 如果我尝试在应用程序中使用 {{=form}},则game_event -column被视为空,但如果我使用内置的“将记录添加到数据库”,则信息就在那里。问题很简单;当内置表单工作正常时,为什么我不能在应用程序的任何地方使用 {{=form}} 用于db.game ?我试图简单地使用 {{=form}} 而不是自定义。

更令人困惑的是,如果我在 web2py 网格中编辑db.game中的任何游戏,并在不更改任何信息的情况下按“提交”,则 db.game 行中的game_event正确显示game_events

我一直坚持这一点,我真的很感激帮助!谢谢。

db.py 中的代码

db.define_table(
    'game',
    Field('name', label='Tävlingsnamn'),
    Field('status', requires=IS_IN_SET(define_game_status),default='started'),
    Field('registration_start_date', 'date', requires = IS_DATE(format=('%Y-%m-%d')),label=T('Registrering öppnar')),
    Field('registration_end_date', 'date', requires = IS_DATE(format=('%Y-%m-%d')),label=T('Registrering stänger')),
    Field('start_date','date',requires = IS_DATE(format=('%Y-%m-%d')),label=T('Start date')),
    Field('end_date','date',requires = IS_DATE(format=('%Y-%m-%d')),label=T('End date')),
    Field('tracs_available','integer', requires=IS_IN_SET(define_track_amount), widget=div_radio_widget, label=T('Tracks')),
    Field('tracs_available_sprint','integer', requires=IS_IN_SET(define_track_amount), widget=div_radio_widget, label=T('Sprint tracks')),
    Field('game_type', requires=IS_IN_SET(define_game_type),default='Inactive', label=T('Type of event')),
    Field('description','text',label=T('Description')),
    Field('game_event',type='list:reference db.game_events', label='Tävlingsgren'),
    format = '%(name)s')

db.game.game_event.requires=IS_IN_DB(db,'game_events.id','%(name)s',multiple=True)

db.define_table(
    'event_class',
    Field('name'),
    format = '%(name)s')

db.define_table(
    'game_events',
    Field('name'),
    Field('class_name', requires=IS_IN_DB(db,db.event_class.name,'%(name)s')),
    Field('event_type', requires=IS_IN_SET(define_game_event_types)),
    format ='%(id)s')

控制器registration.py中的代码

#FORM GAMES
def create_game():
    #Form handling  
    #FORM
    form = SQLFORM(db.game)
    request.vars._formname = 'game'

    form.custom.widget.name.update(_placeholder="ex Skelleftespelen") 

    #Registration of results in view            
    if form.accepts(request.vars, session, formname='game'):    
            print("accepted")
            response.flash = 'Tävlingen har skapats!'
            #game_rows = db(db.game).select(orderby=db.game.name)
            return dict(form=form)    

    elif form.errors:
        response.flash = 'form has errors' 

    return dict(form=form)

视图 create_game.html 中的代码

  <div class="game_name">
            <h4>
                Tävling
            </h4> 
                {{=form.custom.begin}}
                Namn <div>{{=form.custom.widget.name}}</div>      
                Första anmälningsdag <div>{{=form.custom.widget.registration_start_date}}</div>
                Sista anmälningsdag <div>{{=form.custom.widget.registration_end_date}}</div>
                Första tävlingsdag <div>{{=form.custom.widget.start_date}}</div>
                Sista tävlingsdag <div>{{=form.custom.widget.end_date}}</div>
                Sort <div>{{=form.custom.widget.game_type}}</div>
                Sort <div>{{=form.custom.widget.status}}</div>         
                Löparbanor <div>{{=form.custom.widget.tracs_available}}</div>
                Sprintbanor <div>{{=form.custom.widget.tracs_available_sprint}}</div> 
                Beskrivning och/eller information <div>{{=form.custom.widget.description}}</div>          
      Grenar</br></br>
      <p style="background:#FFE066; font-weight:bold;">
          Notera: för att välja grenar måste samtliga önskade grenar att markeras med ctrl + musklick.
        </p>
                <div>{{=form.custom.widget.game_event}}</div>               
                <span id="submit_result">{{=form.custom.submit}}</span>
                {{=form.custom.end}}
    </div> 
4

1 回答 1

0

当您定义一个referenceorlist:reference字段时,如果您没有requires在对 的调用中指定属性Field(),您将获得一个默认requires属性(即验证器)以及一个默认represent属性,该属性控制该字段在表单和网格中的显示方式。但是,为了获取默认值requiresrepresent属性,必须在定义引用字段之前定义被引用的表(否则,引用字段没有足够的信息来创建验证器和represent属性,两者都包含被format引用表的属性)。

因此,只需移动 的定义,db.game_events使其位于 的定义之前db.game。此外,在这种情况下,无需显式设置 的值db.game.game_event.requires,因为它将被分配一个与您分配的值完全相同的默认值。

更一般地说,如果您不喜欢表单/网格中字段值的默认表示,您始终可以设置字段的represent属性来控制显示。

顺便说一句,更喜欢type='list:reference game_events'type='list:reference db.game_events'后者有效,但不受官方支持)。

于 2016-08-06T12:16:35.133 回答