0

Использование web2py. У меня возникли проблемы с отправкой (?) Формы на основе таблицы с использованием списка: reference. У меня есть таблица db.game, которая ссылается на db.game_events в одном из своих столбцов: game_event.Форма web2py со списком: ссылка не работает с {{= form}}

Форма для db.game принимается, но когда я пытаюсь достигнуть данных в столбце game_events, который использует список: ссылка ВЕ db.game_events, столбец пуст в соответствии с установленным в web2py сетка.

Я могу видеть, что информация правильно размещена в базе данных,, показывая элементы в скобках в предположительно пустой колонке. Поскольку я использую встроенную сетку web2py, я предполагаю, что набор строк правильный и что проблема лежит в другом месте.

Если я использую кнопку «Добавить запись в базу данных» в консоли web2py (черная кнопка со знаком плюс) и используйте форму там, столбец game_events показывает элементы.

So; если я пытаюсь использовать {{= form}} в приложении, то game_event -column обрабатывается как пустой, но если я использую встроенную запись «Добавить запись в базу данных», информация есть. Вопрос просто; почему я не могу использовать {{= form}} для db.game в любом месте приложения, когда встроенная форма работает нормально? Я попытался просто использовать {{= form}}, а не обычай.

Чтобы сделать его еще более запутанной, если я изменить любую игру в db.game в web2py сетке, и нажмите кнопку «отправить» без изменения какой-либо информации, в 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> 

ответ

0

При определении reference или list:reference, если вы не указали requires attr ibute в вызове Field() вы получите атрибут по умолчанию requires (т. е. валидатор), а также атрибут represent по умолчанию, который определяет, как поле отображается в формах и сетке. Однако, чтобы получить атрибуты по умолчанию и 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' (последний работает, но официально не поддерживается).

+0

Хм, даже после того, как я изменил порядок в db.py и использую type = 'list: reference game_events', он по-прежнему не работает должным образом. Форма отправляется без ошибок, информация явно находится в базе данных, когда я использую администрацию базы данных для проверки, но строка game_events по-прежнему обрабатывается так, как будто она пуста. По какой-то причине я все еще могу использовать кнопку web2py-console, чтобы добавлять игры с game_events, которые я могу найти в контроллере, а не {{= form}}. Эта проблема действительно меня озадачивает ... –

+0

* Это не строка game_events, которая считается пустой, я имею в виду столбец game_events в игровом столе. –

+1

Вам нужно будет обновить свой вопрос и показать код, который вы используете. Вы упоминаете использование сетки, но вы не видите код, создающий или отображающий сетку. Вы также указываете на проблему с использованием '{{= form}}', но вы не видите код, в котором создается этот объект 'form', и не ясно, насколько это важно, если проблема связана с отображением сетки/таблицы (если только 'form' object - это сетка). Пожалуйста, уточните, какой код вы используете, и точно, что вы видите где. – Anthony