0

web2py を使用して、list:reference を使用してテーブルに基づくフォームを送信 (?) するのに問題があります。game_eventという列の 1 つでdb.game_eventsを参照するテーブルdb.gameがあります。

db.gameのフォームは受け入れられますが、db.game_events を参照する list:reference を使用する列game_eventsのデータにアクセスしようとすると、組み込みの web2py グリッドによると列が空になります。

情報がデータベースに正しく投稿されていることがわかります。空であると思われる列に括弧で囲まれた項目が表示されます。組み込みの web2py グリッドを使用しているため、行のコレクションは正しく、問題は別の場所にあると想定しています。

web2py コンソールで「レコードをデータベースに追加」というタイトルのボタン (プラス記号が付いた黒いボタン) を使用し、そこでフォームを使用すると、game_events 列にアイテムが表示されます。

そう; アプリケーションで {{=form}} を使用しようとすると、game_event -column は空として扱われますが、組み込みの「レコードをデータベースに追加」を使用すると、情報はそこにあります。質問は簡単です。組み込みのフォームが正常に動作するのに、アプリケーションのどこでも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> 
4

1 に答える 1

0

referenceまたはフィールドを定義するときに、 への呼び出し内で属性をlist:reference指定しない場合は、フォームおよびグリッドでのフィールドの表示方法を制御するデフォルト属性だけでなく、デフォルト属性 (つまり、バリデーター) も取得します。ただし、デフォルトと属性を取得するには、参照フィールドを定義するに参照テーブルを定義する必要があります (そうしないと、参照フィールドには、参照テーブルの属性を組み込むバリデータと属性を作成するための十分な情報がありません) )。requiresField()requiresrepresentrequiresrepresentrepresentformat

したがって、 の定義を移動して、 の定義のdb.game_events前に来るようにしますdb.game。また、その場合、db.game.game_event.requires割り当てている値とまったく同じデフォルト値が割り当てられるため、 の値を明示的に設定する必要はありません。

より一般的には、フォーム/グリッドでのフィールド値のデフォルト表現が気に入らない場合は、いつでもフィールドのrepresent属性を設定して表示を制御できます。

余談ですが、prefer type='list:reference game_events'over type='list:reference db.game_events'(後者は機能しますが、公式にはサポートされていません)。

于 2016-08-06T12:16:35.133 に答える