此功能不再是实验性的!
前往此处了解有关该功能及其在社区中用法的更多信息:Creating form templates
您好,Discourse Meta 社区!
我们很高兴推出一项新的实验性功能:表单模板。有了它,您可以在主题创建流程中强制执行带有数据验证的结构化表单。
启用功能
该功能隐藏在全站实验性标志后面。要启用它,只需在
管理 ▸ 设置 下开启
experimental_form_templates站点设置即可。管理模板
表单模板可以在
管理 ▸ 自定义 ▸ 模板 (
/admin/customize/form-templates/) 创建、编辑和删除。在那里,您将看到一个包含论坛上现有模板列表的表格。您可以编辑、删除和预览任何现有模板,也可以创建新模板。该表还显示了每个模板当前激活的类别。
模板以 YAML 结构定义。您可以手动输入,也可以利用顶部的“添加”按钮,它们会将一段示例 YAML 代码追加到末尾,定义某种输入类型。
这是一个完整的 YAML 示例,包含所有字段类型:
- type: input id: name attributes: label: "全名" placeholder: "例如:张三" description: "您的全名是什么?" validations: required: true minimum: 2 maximum: 100 - type: textarea id: introduction attributes: label: "介绍" placeholder: "一个简短的介绍" description: "写一个关于您自己的简短介绍" validations: required: true minimum: 10 maximum: 500 - type: dropdown id: fav-animal attributes: label: "最喜欢的动物" description: "选择您最喜欢的动物" none_label: "选择一个选项" choices: - "狗" - "猫" - "其他" validations: required: true - type: multi-select id: comm-channel attributes: label: "沟通渠道:" description: "选择您首选的沟通渠道:" none_label: "选择一个选项" choices: - "电子邮件" - "电话" - "即时通讯软件" - type: upload id: cat-photo attributes: label: "猫的照片" description: "发送一张您猫的照片(或任何猫的照片)" file_types: ".jpg, .png" allow_multiple: false - type: checkbox id: accept-terms attributes: label: "我已阅读并同意条款" description: "您需要接受条款才能继续" validations: required: true验证
对于每个字段,您可以添加验证选项,在提交表单之前必须通过这些选项。有关可用验证的列表,请点击代码编辑器上方的 验证 按钮。这将向您显示每个验证选项的语法并描述其预期用途。
验证选项
键 类型 描述 required boolean 要求填写该字段才能提交表单 minimum integer 对于文本字段,指定允许的最小字符数 maximum integer 对于文本字段,指定允许的最大字符数 pattern regex string 对于文本字段,指定允许的输入的正则表达式 type string 对于输入字段,您可以指定应预期的输入类型 (text 将模板应用于类别
创建表单模板后,您需要将其应用于某个类别。为此,请转到要应用模板的类别的设置。
选择 模板 菜单,然后在右侧使用开关开启表单模板。启用后,您可以使用下拉菜单将一个或多个模板添加到类别中。
填写表单
一旦模板应用于某个类别,当您创建主题并选择具有该模板的类别时,模板的表单将自动显示。如果一个类别分配了多个模板,您还会看到一个选择器,用于在可用模板之间切换。
填写表单时,它将遵守表单模板定义中指定的任何验证,并且只有在有效后,您才能点击
创建主题,它将根据所有输入字段生成主题内容。
最后,提交后,主题内容将由所有填写好的字段组成:
预填充表单值
您还可以通过使用与表单模板中定义的字段 ID 匹配的参数调用
/new-topic来预填充表单值。例如,对于先前用作示例的模板:
/new-topic?name=John%20Smith&favorite-animal=Cat路线图
- 在创建主题时将 JSON 输出存储在主题数据中
- 切换到在有表单模板的类别上仍可以选择并使用自由格式编辑器
您如何帮助我们
我们很想听听您对这项新功能的反馈。如果您是管理员并想在您的论坛上试用它,您可以开启
experimental_form_templates设置并立即开始使用它们!请以 form-templates 标签开始新主题,分享您的体验、报告任何错误或提供任何建议。
感谢您帮助我们改进 Discourse!
这看起来非常有帮助,我一定会启用它进行试验。
我发现一个有用的功能是能够将模板字段链接到用户自定义字段。例如,在支持类别中,支持人员通常会问的头两个问题是“设备型号”和相关的“网站 URL”。有了这个模板功能,我现在可以在创建每个新主题时要求提供这些信息 ![]()
这两条信息通常也引起其他用户的兴趣,因此它们被定义为自定义用户字段——有时会被填写。如果模板字段可以从链接的自定义用户字段(如果它有值)填充,那么对于常客来说,他们可以填写他们的用户字段,而不必每次都填写模板字段。偶尔的访客可以根据需要填写模板字段。
作为进一步的建议,锦上添花的功能是链接可以反向工作。如果有人在模板中输入了自定义用户字段中不存在的数据,那么在发布主题时,自定义字段将被更新。
你好 ![]()
这是最好的改进之一。它提供了许多机会。 ![]()
一些说明:
-
似乎
form_templates.errors.valueMissing.number是一个缺失的字符串。 -
似乎
tel验证不起作用。 -
在移动设备上,作曲家中的表单模板不可滚动。
-
在移动设备上,当表单模板可用时,页脚按钮不起作用。我认为隐藏它们会很好。

\+ 添加验证以防止 number 类型出现负数会很有用。用例(价格)![]()
\+ 添加动态条件字段功能也会很有用。
谢谢 ![]()
如前所述,这在支持场景中将非常方便,我特别喜欢 @packman 关于自定义用户字段的建议。
将表单模板添加到组是否也在路线图上(或者可以添加吗)?当通过群组消息传递用于私人支持时,这对于在工作人员到达之前预先加载问题尤其有用。
根据自定义字段的可见性,这可能会带来隐私方面的影响。例如,用户可能选择在私有类别中通过表单模板共享信息,但不想通过其个人资料与更广泛的社区共享该信息。
根据信息的性质,它也可能有一个适用于其个人资料和/或大多数表单的值,但他们可能希望在特定情况下提供不同的值。
我喜欢从这些字段填写表单并能够在输入的数值不同时更新字段的想法,但这也许应该是一个提示。这是一个非常快速和粗糙的模拟,但也许在创建主题后(仅当数值不同且可能仅在非空时)会有一些类似的东西:
我对我这个很棒的新功能的特性请求,我认为在软件支持论坛中很常见。
人们常常忽略指定他们的软件版本。就是这样。很简单,但这是导致许多许多无用的来回帖子(这会让那些帮助很多人的人感到厌烦,而我们不希望让社区里最重要的人感到厌烦)的原因。
所以我想做一个表单来询问:
- 您的 FabulousApp 版本是…(下拉选项)
- 您的 PHP 版本是…(下拉选项)
现在,假设有人经常在论坛发帖。这些信息不会经常改变,尽管它可能会改变,比如说,一个月一次。
该表单应保留该用户在其先前帖子中选择的值作为默认值,这就是我的功能请求。您怎么看?
我认为在某些情况下,预先填写的字段可能会导致用户忽略它,并且在需要更改值时不会进行更改。![]()
当然,这纯属猜测。
结合这两点是我希望在我的用例中看到的。对于多个应用程序,我希望用户能够选择他们的应用程序,然后从与该应用程序对应的列表中选择他们的版本。
这绝对是我对选择的经验。对于电子邮件联系表单中的默认值,绝大多数提交都具有该默认值,而不管他们实际使用的是哪个应用程序或版本。
这对于默认值来说可能是正确的,但在我设想的情况下,字段值将是用户先前在自定义字段中输入的值。这些可能已过时/不正确,但我认为在我的用例中,错误值的数量将远远少于当前没有值的数量。
当然。在我看来,这些大多是两个不同的信息类别:某个时间点的状态和用户偏好/身份/等等。我所说的关于默认值的经验更多的是指前者。
两个请求!
- 一个自动用
` 围住内容的字段- 可以有一个语言下拉菜单,并有一个默认值。
- 一个允许用户复制字段的属性(我想象的是该字段下方有一个
+按钮)。- 想象一下,如果用户想发布两个代码块,或多个图像。他们可以输入一个,点击
+然后添加另一个。
- 想象一下,如果用户想发布两个代码块,或多个图像。他们可以输入一个,点击
这是一个很棒的新功能,而且可能对我正在进行的一个项目来说,时机也很合适。
在简单试用了一下之后,我有两个问题:
-
目前,当用户通过表单模板编辑他们创建的帖子时,只会显示默认的帖子编辑器。
是否计划在编辑帖子时也显示表单模板编辑器? -
是否会有添加自定义输入类型的选项?
我正在考虑一个地图功能,用户可以通过在地图上放置图钉来选择他们的位置。因此,能够定义这种自定义字段类型将非常有用。
这正是我用例的完美时机!我想知道是否计划最终允许自定义表单模板在主题中的呈现方式。
例如,在下图中,checkbox 字段类型被渲染为文本 on:
最终是否有人能够将表单字段类型映射到自定义输出?
例如,在我的情况下,我希望一个已选中/on 的复选框映射到复选框格式 [x],而未选中/关闭状态映射到 []
我可能不得不开始学习 Ruby 并围绕这个项目进行一些修改,这次表单更新给了我很多绝妙的想法。感谢你们的辛勤工作!
这是强制特定类别(我的痛点是职位发布,每个人都随意发布
)中某些行为的绝佳方式!
如果能增加一些额外功能就更好了:
- 能够“切换到无模板”(可选)。这可以按用户、级别、组等进行限制;某种程度上的“相信我,我知道我在做什么!”
- 同一行中的多个字段(例如名字 + 姓氏)。一个足够好的修复方法是允许管理员为表单模板设置类名;
- 重复器(即组合一组字段并允许用户添加更多字段);
可以添加以下功能:
- 将内容粘贴到上传字段中[^1]。
- 除了文本区域外,还可以添加一个编辑器,让用户可以使用常规功能集。[^2]
[^1]:Discourse 帖子中的上传功能很棒。这个功能更难使用,例如需要将图片预先保存到磁盘。
[^2]:如果我希望用户在帖子之外选择一个下拉菜单,那么使用当前的方法(文本区域),我会大大降低他们正常创建帖子的能力;无法粘贴图片,没有编辑栏等。
我在这里尝试使用表单来报告有关主题的错误。这是我的反馈:
- 表单本身是个好主意

- 没有格式工具是一个很大的疏漏。
- 即使 markdown 语法很简单,选择和使用工具栏通常也更简单/更快。它有助于创建可读的消息。
- 如果报告是一个简单但高级的问题,这可能有效;您可能需要隐藏详细信息或插入表格。
- 没有内联上传不方便。
- 例如,逐步显示问题,之前/之后的结果等。
- 如果有多个屏幕截图,您必须解释应该查看哪些屏幕截图。
- 和 Thomas 一样,粘贴图片会很受欢迎。我花了一些时间才弄清楚我的屏幕截图保存在哪里。

- 条件输入——选择“其他”时,最好出现一个输入框。
总的来说,非常好!我期待它的改进。 ![]()
如果您为单个类别启用了多个表单,那么您有一个用于选择表单的下拉菜单,这并不直观。创建新主题时,它会自动填充第一个表单模板,同样,如果您不知道您在看什么,那么您不会意识到可能还有其他表单。
取消选择表单时,您确实会看到“选择表单模板”的文本,这对我来说很清楚,有一个我选择的表单列表。即使没有选择表单,撰写器仍然显示表单。这就是我将再次同意 @iamntz 的观点,即可以选择切换到无模板。
我想在我之前的回复中补充一些内容,并为我们的具体用例提供更多背景信息。我们希望将其应用于“站点反馈”类别。理想情况下,我们希望有用于请求标签等内容的表单模板,并保留默认的撰写器(无模板选项),如果表单不存在或无法正常工作。
因此,我们设想的是在类别中创建新主题,然后看到这个:
然后,看到“选择表单模板”,在那里你可以正常撰写,或者看到该类别中存在用于标准化请求/反馈的表单。![]()
我可以看到一些用户看不到或不使用表单模板的论点,如果他们可以撰写的话,但我试图保持当前的样式,将占位符文本放在字段内而不是字段外的标签上。但这就是为什么它可以是一个管理员启用/禁用的可选功能。![]()
如果选择按钮有清晰的突出显示,那会更容易鼓励用户点击它,类似于您的“创建主题”按钮。
在更多地使用表单后,我们发现了一个“无模板”选项的变通方法,即创建一个简单的“自由响应”表单,它可以作为无模板(如下图所示)。
在此想法的基础上,如果我们不想更改颜色来突出显示下拉菜单,我认为添加一个向下的箭头将是一个有用的指示器,表明存在下拉选择,就像类别下拉菜单一样。
我们发现表单是按字母顺序排列的。如果能有选项来重新排序表单,或者选择创建新主题时应出现的默认表单,那就太棒了。
Needless to say,我们喜欢此功能提供的服务,并对其进行增强感到兴奋。 ![]()
也许我错过了,但是否有办法在表单中添加超链接?例如,假设我们有一个用于条款和条件的复选框。在“description”中,添加一个指向实际条款和条件的超链接会很有用。
这已经可能了吗?
是否也有办法在用户创建新帖子时自动填充标题字段,例如使用他们的用户名,或者仅仅是某个默认标题?









