【问题标题】:Web2py SQLFORM in HTMLHTML 中的 Web2py SQLFORM
【发布时间】:2012-11-21 14:49:29
【问题描述】:

我正在关注 Web2py 关于 HTML 中 SQLFORM 的书。 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>

控制器/默认/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()

模型/db.py:

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

【问题讨论】:

  • test.html 文件中的代码是什么(查看)

标签: python web2py


【解决方案1】:

请注意,本书示例包括以下内容:

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

在上面,设置session=None 禁用隐藏的“_formkey”字段,该字段用于防止CSRF攻击和双重表单提交。但是,在您的代码中,您没有设置session=None,这意味着在提交时处理表单时,它期望接收隐藏的“_formkey”值。如果找不到该值,则处理失败,尽管它不会生成任何form.errors,因此不会触发您的错误条件。要准确复制本书示例,您必须设置session=None。否则,如果您想保留 CSRF 保护(这是一个好主意),您可以在表单 HTML 中添加以下内容:

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

您还必须修改控制器函数以返回表单键值以在视图中使用:

def test():
    ...
    return dict(formkey=form.formkey)

【讨论】:

  • 我收到一个错误,提示 SQLFORM 中没有属性 formkey。
  • formkey 属性仅在调用.process() 方法之后 存在,并且仅在您未设置session=None 时存在。
【解决方案2】:

您需要将 HTML 代码放在名为 test.html 的视图中

和代码:

 session.flash = T('Succeeded.')

改成:

response.flash='Succeeded.'

T() 查找要翻译的已定义字符串,但我没有看到名为 Succeeded 的字符串。关于语言文件。

仅试用您的视图文件:

{{=form}}

这样web2py会自动为你生成表单,不需要手动编码表单

【讨论】:

  • 注意,设置session.flash = T('Succeeded.')是可以的,即使没有“成功”。语言文件中的条目。任何不在语言文件中的字符串都将被自动添加,然后您可以进入并添加翻译(如果您不添加翻译,则字符串将简单地显示为未翻译——您不会收到错误消息)。
  • 是的,我确实将我的 HTML 代码放在了 views 文件夹中的单独文件中。我只是没有在这里说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多