Python Slack Bolt开发Slack Bot如何设置必填字段与输入校验
解决方案
核心前提说明
Slack 普通消息(含chat_postEphemeral发送的临时消息)挂载的blocks表单,和Modal弹窗表单的校验逻辑有本质区别:
- input块默认即为必填状态,只有显式配置
"optional": true时才会标记为非必填,之前配置optional: true未达到必填效果,是因为字段逻辑搞反了 - 普通消息内的表单不支持提交前原生拦截校验,所有必填、格式校验逻辑都需要在提交按钮的回调函数中手动实现
1. 必填项配置方法
- 开始日期、结束日期、Field1 这类需要必填的input块,直接删除块内的
optional字段即可,保持默认必填属性 - Field3、数值输入框这类非必填字段,在对应input块中添加
"optional": true标记即可,非必填字段配置示例:
{ "type": "input", "optional": true, "hint": { "type": "plain_text", "text": "Numeric values only" }, "element": { "type": "plain_text_input", "action_id": "plain_text_input-action", "placeholder": { "type": "plain_text", "text": "Enter Numeric Value" } }, "label": { "type": "plain_text", "text": " " } }
- 提交时手动校验必填项:监听submit按钮的action事件,触发后从
body["state"]["values"]中取出所有必填字段的值,若存在空值,直接调用chat_postEphemeral给当前用户发送错误提示,终止后续业务逻辑即可。
提示:现有blocks中所有input块都未配置唯一
block_id,从返回值中取表单数据时定位会非常麻烦,建议给每个input块添加全局唯一的block_id字段。
2. 数值输入框校验实现
Slack的plain_text_input组件没有原生的输入字符过滤能力,无法直接禁止用户输入非数字内容,可通过以下两种方案实现校验:
方案1:提交时统一校验(实现成本最低,最常用)
在submit按钮的回调逻辑中,取出数值输入框的内容做格式判断,不符合要求就返回错误提示,校验代码示例:
@app.action("submit_action") def handle_form_submit(ack, body, client): ack() form_data = body["state"]["values"] # 替换为你给数值输入块配置的block_id num_input_value = form_data["number_input_block"]["plain_text_input-action"]["value"] # 非必填字段先判断是否有输入值 if num_input_value: # 支持整数、浮点数校验,若仅允许整数可直接用num_input_value.isdigit()判断 if not num_input_value.replace('.', '', 1).isdigit(): client.chat_postEphemeral( channel=body["channel"]["id"], user=body["user"]["id"], text="❌ 数值字段仅允许输入数字,请修改后重新提交" ) return # 后续继续完成必填项校验、业务处理逻辑
方案2:输入时实时校验(体验更好)
给数值输入框添加输入触发事件配置,用户每输入一个字符就触发校验,不符合格式立刻提示,配置方式如下:
- 修改数值输入框的element配置,添加实时触发规则:
"element": { "type": "plain_text_input", "action_id": "plain_text_input-action", "placeholder": { "type": "plain_text", "text": "Enter Numeric Value" }, # 新增以下配置,输入字符时自动触发action "dispatch_action_config": { "trigger_actions_on": ["on_character_entered"] } }
- 编写对应action的监听逻辑,判断输入内容包含非数字字符时,立刻给用户发送临时提示即可。
内容的提问来源于stack exchange,提问作者Gavya Mehta
相关产品推荐
相关产品推荐

