0

有没有办法将随机数添加到手动创建的表单中?例如,在控制器中创建一个 SQLFORM 并将其呈现为{{=form}}视图将自动将 nonce 附加到表单。

但是像这样手动创建的东西:

<form>
    <input type="text">
    <button type="Submit">Submit</button>
</form>

不会有nonce。

4

1 回答 1

0

FORM()您可以像往常一样使用或构造和处理控制器中的表单对象SQLFORM()。在这种情况下,您仍然可以在视图中为表单创建完全自定义的 HTML(只要输入字段名称匹配)——您只需包含特殊的隐藏 _formname 和 _formkey 字段,您可以通过form.custom.end.

在控制器中:

def myform():
    return dict(form=SQLFORM(db.mytable).process())

在视图中:

<form>
    <input type="text">
    <button type="Submit">Submit</button>
{{=form.custom.end}}

注意,form.custom.end包括结束</form>标记,因此无需显式添加。

如果您希望 HTML 更明确,您还可以通过form.formnameand访问 _formname 和 _formkey 值form.formkey,因此您可以这样做:

<form>
    <input type="text">
    <button type="Submit">Submit</button>
    <div style="display:none;">
        <input name="_formkey" type="hidden" value="{{=form.formkey}}" />\
        <input name="_formname" type="hidden" value="{{=form.formname}}" />
    </div>
</form>

这会生成与上述版本相同的 HTML,使用form.custom.end.

注意,web2py 将 _formkey 值存储在会话中,使用 _formname 作为从会话中检索它的键。提交表单时,该.process()方法从会话中检索 _formkey 值并检查它是否与随表单提交的 _formkey 值匹配——如果不匹配,则处理失败。

最后,如果您真的只想创建自己的自定义表单键并处理将其存储在会话中并将其与自己通过表单提交的值进行比较,您可以执行以下操作:

from gluon.utils import web2py_uuid()
custom_formkey = web2py_uuid()

然后,您必须明确处理 formkey 检查。

于 2013-05-09T14:33:24.750 回答