0

SQLFORM.factory を使用してカスタム フォームを作成しました。

このフォームが送信されると、ポストバックが発生し、コントローラーのインデックス メソッドになります。

フォームを検証するために特定の行の下に書き込むと、False と評価されます。

if searchform.process().accepted:#THIS CONDITION EVALUATES TO FALSE

しかし、この行を以下の行に置き換えると、True と評価されます。

if searchform.accepts(request):#THIS CONDITION EVALUATES TO TRUE

以下の条件も失敗します。

if searchform.accepts(request,session):#THIS CONDITION EVALUATES TO FALSE

なぜこれが起こっているのか、私にはわかりません。好ましい条件は最初のものであるべきだと思います。

このフォームを作成するコードを以下に詳しく示します。

searchform=SQLFORM.factory(
    Field('id', 'unicode',requires=empty_to_none),
    Field('account','unicode',requires=empty_to_none),
    Field('fromdate','unicode',requires=empty_to_none),
    Field('todate','unicode',requires=empty_to_none),
    Field('name','unicode',requires=empty_to_none),
    Field('status','integer'),
    Field('method',requires=IS_EMPTY_OR(IS_IN_SET(['Method1','Method2','Method3'], sort=True, zero='Select'))), 
    Field('type','unicode',requires=IS_EMPTY_OR(IS_IN_SET(['Type1','Type2',], sort=True, zero='Select'))), 
    Field('altname','unicode',requires=empty_to_none),
    Field('group','unicode',requires=IS_EMPTY_OR(IS_IN_SET(['Group1','Group2',], sort=True, zero='Select'))), 
    Field('assignee','unicode',requires=empty_to_none),
    submit_button = 'Search'
)    

この問題を解決するのを手伝ってください。

4

1 に答える 1

1

に渡すsessionと、 CSRF 攻撃から保護するために.accepts()、非表示フィールドがフォームに追加されます (そして、同じ値がセッションに追加されます)。_formkeyフォームの送信時に、送信された値がセッションに保存されている値と一致.accepts()することを確認します。そうでない場合、検証は失敗します。_formkey(注:.process()メソッドは の単なるショートカットです.accepts(request, session))。

sessionfromを除外した場合にのみ検証が失敗するため、(a) HTML にシリアル化されたときに.accepts()非表示の_formkeyフィールドがビューに含まれていない、(b) セッション Cookie がフォームに送り返されていないように見えます。フォーム post を持つサーバー、および/または (c)_formkey値が何らかの形でセッションからクリアされている (たとえば、 のようなものを介してsession.clear())。

最も可能性の高い犯人は(a)です。ビューでカスタム フォーム HTML を作成した場合は、隠しフィールド_formname_formkeyフィールドを含める必要があります。最も簡単な方法は次のとおりです。

{{=form.custom.end}}  # includes the closing </form> tag

また:

{{=form.hidden_fields()}}  # does not include the closing </form> tag

個々の非表示フィールドの値はform.formnameおよびにありform.formkeyます。

于 2013-09-11T11:56:09.767 に答える