它看起来不像是在使用内置的表单机制。我很好奇你到底需要如何清理你的数据?

通常,您将创建一个控制器文件,其中包含一个构建表单的函数,并有一个分支来处理它。在数据模型中,您将指定什么是可接受的输入,并在表单处理函数(控制器函数)中操作数据。

你也可以使用form.process(..., onvalidation=some_func)

其中onvalidation是一个函数,它可以进一步处理表单,在将值存储到数据库之前创建/操作值(或者根本不能将它们存储在DB中),并执行进一步的验证。

Web2py表单通常是自提交的,并且有一个会话密钥集,以防止双重提交等。你这样做的方式你必须确保使用形式。接受(…)没有会话或跳过web2pyform.接受/form.加工和使用你提供的request.vars.field_name_获取表单字段数据。然后你必须自己验证数据。

我建议创建一个web2py模型(models/表单.py),或者至少在负责显示和处理表单的控制器文件中使用web2py的表单助手创建表单。

这是web2py方法,单个函数要么返回要填充的表单,要么处理它。如果一切正常,可以使用重定向将它们发送到另一个页面。

^{pr2}$

另一种方法是:

def process_form():
validated_data = dict()
for k,v in request.vars.values(): # I think this works...
if k == 'some_key':
do_some_processing()
...
validated_data[k] = some_func(v)
...
# now everyhing is validated and ok, send the data on
redirect('next_page', vars=validated_data)

重定向将把经过验证的表单数据发送到下一个函数。如果不需要将它发送到web2py函数,那么从process_form函数执行所需的任何函数。

有道理吗?

脚本的另一种处理方式是编辑。可以定义由同一控制器文件中的另一个函数显式执行的控制器函数。它不会有一个相关联的视图,也不会是一个独立的页面,而只是一个函数。

也可以使用execfile(“path/to/file”)。我建议将脚本放在applications//private/中并使用请求文件夹要获取应用程序所在的文件夹,然后只需加上private…所以如下所示:execfile(os.path.join(request.folder, 'private', 'script.py'))

但你得确认这能给你正确的路径。

编辑(验证表单):查看web2py关于如何建立数据模型和使用表单/验证器(http://web2py.com/books/default/chapter/29/7)的书。定义web2py数据模型时,可以在字段定义中直接包含验证器。这样,数据库将知道它是整数还是字符串,您可以在输入上强制使用长度或正则表达式模式。其优点是您创建的表单:form = SQLFORM(db.some_table)

甚至:

形式=SQLFORM.factory(Field('some\u Field','integer'),Field('some\u str','string',requires=IS_字母数字))

验证非常简单整型字段将立即删除输入的任何非数字值,即使您修改了源代码或发送了带有错误值的POST/GET请求,也会形式.过程(…)方法将使其无效,并允许您轻松地突出显示错误。

以下是表单定义示例:

db.define_table('news_item',
Field('title', 'string', label='Title', requires=IS_NOT_EMPTY()),
Field('type', 'string', label='Type', requires=IS_IN_SET(news_types)),
Field('pub_date', 'date', default=request.now),
Field('post_date', 'date', default=request.now), # Set date defaults
Field('link', 'string', label='News Link', requires=IS_EMPTY_OR(IS_URL())),
Field('img', 'upload', uploadfield='img_file', label='Story Title Image'),
Field('img_file', 'blob', label='Story Title Image'),
Field('tagline', 'text', label='Tagline', requires=IS_NOT_EMPTY()),
Field('published', 'boolean', label='Published?', notnull=True, required=True),
)

它将在程序前面定义的数据库中创建一个名为news_item的表(db=DAL(“…connection string”)),并允许您立即创建一个好看的表单。注意有很多选项参数。

您也可以跳过数据库直接制作表单,但我让您在文档中查找:)