显示表单数据和验证错误的最佳设计模式是什么?

9 投票
6 回答
1763 浏览
提问于 2025-04-16 10:43

在实际应用中,如果我使用一个表单框架,最终总会在某个时候和它发生冲突。

我对在网站上构建表单的最佳实践模式很感兴趣。如果能提到任何语言的实现,那就更好了(我通常使用Python)。我特别关注的是如何创建和展示表单给最终用户。

这是我对这个话题的看法。表单工作流程的大部分内容可以通过一些轻量级的组件来处理,这些组件可以从像 formencodeformish 这样的框架中提取出来。这里的“大部分”指的是解码提交的表单数据为一个合理的数据结构(例如,表单中重复的字段应该变成Python中的列表);转换这些值为我们想要的类型(例如,一个“年龄”字段应该变成一个整数);以及验证这些值(例如,“年龄不能为空”)。

我最终会和表单本身的创建和展示发生冲突。许多框架(例如 FormAlchemy)将它们的模式、验证和模型紧密结合到某种表单小部件生成方案中,这让我不太喜欢。

制作表单涉及的任务有:

  • 制作动态小部件(例如,从数据库中获取值的下拉列表)
  • 循环处理重复的字段集(例如,一组姓名和年龄的配对,每个代表一个人)
  • 在表单字段中嵌入已有的值(来自数据结构)
  • 在表单字段旁边或页面顶部显示验证错误

我看到的处理这些任务的选项有:

  • 生成,基于在模式中定义的小部件(例如 Django
  • 后处理表单,通过将包含错误和值的数据结构应用到HTML模板中(例如 htmlfill
  • 接受对于除了最简单的情况之外,你可能需要在每个表单模板中手动编码逻辑(循环、错误显示等)

还有其他处理这个问题的模式吗?每种方法的优缺点是什么?

我目前查看过的框架(Python)包括: flatlandformencodeFormAlchemyformishWTFormsDjango 表单, web2pydeformFormConvertweb.py

更新:我还没有找到关于构建表单的最佳实践的答案,但我在当前项目中决定使用deform / colander,这是一种处理序列化等的合理方法,更重要的是,它有很好的文档和测试。我将尽量避免为除了最简单的表单之外的所有表单生成。

6 个回答

1

在2010年的PyCon大会上,有一个讨论小组,里面有几个表单库的作者,他们分享了一些内容,可能对你的问题有帮助:

http://www.pycon.tv/video/184/

1

还有一个叫做 web.py 的库,它里面有一个表单类,你可能会觉得很有意思。你可以在它的 食谱 中找到一些例子。

3

你可以试试 django。它有一个叫 forms 的模块,这个模块提供了很多方便的工具,可以帮助你处理网页表单。

撰写回答