2017-08-21 10 views
0

私はデコレータを使用して、ユーザーがログインしてフォームを送信することができます。しかし、ユーザーがサブミットをクリックすると登録/サインアップにリダイレクトされるように設定する必要があります。Web2pyフォームクリック時のユーザー認証

現在、私のコントローラの私のフォームが似ている:

@auth.requires_login() 
def survey_create(): 
    form = SQLFORM(db.survey).process() 
    if form.accepted: 
     session.flash = 'Survey Processed' 
     redirect(URL('index')) 
    return locals() 

私は彼が提出する上でクリックすると、ユーザー登録フォームを送信する必要があります。

お知らせください。

def survey_create(): 
    if auth.is_logged_in(): 
     def onsuccess(form): 
      db.survey.insert(db.survey._filter_fields(form.vars)) 
      session.flash = 'Survey Processed' 
     next_url = URL('default', 'index') 
    else: 
     def onsuccess(form): 
      session.survey_submission = form.vars 
      session.flash = 'Please Register' 
     next_url = URL('default', 'user', 'register') 

    form = SQLFORM(db.survey).process(dbio=False, onsuccess=onsuccess, next=next_url) 

    return dict(form=form) 

.processを呼び出し、dbioは、データベースへの提出の自動挿入を防止するためにFalseに設定されている次のように

+0

フォーム提出を保存し、登録に成功した後にのみデータベースに挿入しますか? – Anthony

+0

はい。しかし、その前に、私は彼がサインインしていない場合にのみ、ユーザをログイン/サインアップにリダイレクトする必要があります。ありがとう –

答えて

1

あなたは、コントローラを変更することができます。代わりに、onsuccessコールバックとnext_urlのURLは、ユーザーがログインしているかどうかによって、フォームの送信が成功したときの処理を制御します。ユーザーがログインしていない場合は、form.varsがセッションに格納され、 。登録が成功した後、保存されたアンケートの提出を挿入するために、あなたはモデルファイルに次のコードを追加することができます

auth後のどこかが定義されている):

def insert_survey(_): 
    if 'survey_submission' in session: 
     db.survey.insert(db.survey._filter_fields(session.survey_submission)) 
     del session.survey_submission 
     session.flash = 'Survey Processed' 
     redirect(URL('default', 'index')) 

auth.settings.register_onaccept.append(insert_survey) 

上記レジスタのコールバックいます登録後に呼び出されます。セッションに保存されている調査依頼を確認し、見つかった場合は、その依頼をデータベースに挿入してセッションから削除します。