1

私はHTMLのSQLFORMに関するWeb2pyの本をフォローしています。 http://web2py.com/books/default/chapter/29/07#SQLFORM

しかし、私には理解できないようです。非表示フィールドname="_formname"とその値をに設定しましたtest。フォームは処理されていないようです。これが私のコードです:

test.html:

<form action="" method="post">
    <ul>
       <li>Your name is <input name="name" /></li>
    </ul>
    <input type="submit" />
    <input type="hidden" name="_formname" value="test" />
</form>

controller / default / test.py:

def test():
form = SQLFORM(db.person)
if form.process(formname='test').accepted:
    session.flash = T('Succeeded.')
    redirect(URL('index'))
elif form.errors:
    response.flash=T('Form has errors.')
return dict()

model / db.py:

db.define_table('person',
Field('name', requires=IS_NOT_EMPTY()))
4

2 に答える 2

2

本の例には次のものが含まれていることに注意してください。

form.process(session=None, formname='test')

上記で設定session=Noneすると、CSRF攻撃とダブルフォーム送信からの保護に使用される非表示の「_formkey」フィールドが無効になります。ただし、コードで設定していませんsession=None。つまり、送信時にフォームが処理されるときに、非表示の「_formkey」値を受け取ることが期待されます。値が見つからない場合、処理は失敗しますが、は生成されないform.errorsため、エラー状態はトリガーされません。本の例を正確に複製するには、を設定する必要がありますsession=None。それ以外の場合、CSRF保護を保持したい場合(これは良い考えです)、フォームHTMLに以下を追加できます。

<input name="_formkey" type="hidden" value="{{=formkey}}" />

また、ビューで使用するフォームキー値を返すようにコントローラー関数を変更する必要があります。

def test():
    ...
    return dict(formkey=form.formkey)
于 2012-11-21T18:14:18.237 に答える
1

test.htmlというビューにHTMLコードを配置する必要があります

とコード:

 session.flash = T('Succeeded.')

次のように変更します。

response.flash='Succeeded.'

T()翻訳する定義済みの文字列を探しますが、Succeededという文字列が表示されません。言語ファイル。

ビューファイルのみを試してください。

{{=form}}

このようにして、web2pyはフォームを自動的に生成します。フォームを手動でコーディングする必要はありません。

于 2012-11-21T15:30:06.733 に答える