Форма web2py со списком: ссылка не работает с {{=form}}
При использовании web2py у меня возникают проблемы при отправке (?) Формы на основе таблицы с использованием list:reference. У меня есть таблица db.game, которая ссылается на db.game_events в одном из ее столбцов с именем game_event.
Форма для db.game принята, но когда я пытаюсь добраться до данных в столбце game_events, который использует список: ссылка на db.game_events, столбец становится пустым в соответствии со встроенной сеткой web2py.
Я вижу, что информация правильно размещена в базе данных, показывая пункты в скобках в предположительно пустом столбце. Поскольку я использую встроенную сетку web2py, я предполагаю, что набор строк правильный, и что проблема кроется в другом месте.
Если я использую кнопку с надписью "Добавить запись в базу данных" в консоли web2py (черная кнопка со знаком плюс) и использую там форму, столбец game_events показывает элементы.
Так; если я попытаюсь использовать {{=form}} в приложении, столбец game_event будет считаться пустым, но если я использую встроенный "Добавить запись в базу данных", информация там есть. Вопрос просто; почему я не могу использовать {{=form}} для db.game где-нибудь в приложении, когда встроенная форма работает нормально? Я пытался просто использовать {{=form}}, а не на заказ.
Чтобы сделать это еще более запутанным, если я отредактирую какую-либо игру в db.game в сетке web2py и нажму "submit", не меняя никакой информации, столбец game_event в строках db.game правильно отобразит 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>
1 ответ
Когда вы определяете 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'
(последний работает, но официально не поддерживается).