使用web2py,我无法使用list:reference基于表格提交(?)表单。我有一个表 db.game ,它在 game_event 的一个列中引用了 db.game_events 。
接受 db.game 的表单,但当我尝试访问列 game_events 中的数据时,使用list:reference reffering to db.game_events,根据内置的web2py网格,该列为空。
我可以看到信息已正确发布到数据库,显示所谓空列中括号内的项目。由于我使用内置的web2py网格,我假设行的集合是正确的,问题出在其他地方。
如果我在web2py控制台中使用"添加记录到数据库" -titled按钮(带加号的黑色按钮),并在那里使用表格,则game_events列显示项目。
因此;如果我尝试在应用程序中使用{{= form}}, game_event - 列将被视为空,但如果我使用内置"将记录添加到数据库",信息在那里。问题很简单;当内置表单工作正常时,为什么我不能在应用程序的任何位置使用{em = db.game {{= form}}?我试图简单地使用{{= 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>
答案 0 :(得分:0)
定义reference
或list:reference
字段时,如果您未在requires
的调用中指定Field()
属性,则会获得默认值requires
属性(即验证程序)以及默认的represent
属性,用于控制字段在表单和网格中的显示方式。但是,为了获取默认的requires
和represent
属性,必须在定义引用字段之前定义引用的表(否则,引用字段没有足够的信息)创建验证器和represent
属性,这两个属性都包含引用表的format
属性。)
因此,只需移动db.game_events
的定义,使其位于db.game
的定义之前。此外,在这种情况下,不需要显式设置db.game.game_event.requires
的值,因为它将被分配一个与您指定的默认值完全相同的默认值。
更一般地说,如果您不喜欢表单/网格中字段值的默认表示,您始终可以设置字段represent
属性来控制显示
顺便说一句,更喜欢type='list:reference game_events'
而不是type='list:reference db.game_events'
(后者有效但未得到官方支持)。