在Django中,表单按钮name属性为button和submit的区别是什么?
其实这俩按钮在Django表单里都能触发提交,但从原生HTML行为、Django处理逻辑和语义化这几个维度看,还是有不少区别的:
原生HTML层面的默认识别
HTML标准里,name="submit"是提交按钮的「默认约定名」——有些浏览器或者基础的表单处理脚本会自动把带这个name的按钮视为表单的提交触发源。哪怕你没手动写type="submit"(不过Django的{% buttons %}标签会自动帮你补上这个属性),原生逻辑对submit这个name的兼容性和识别度都更高。而name="button"只是一个普通的自定义命名,没有这种原生层面的默认待遇。Django视图处理的区分逻辑
当你的表单有多个提交按钮(比如「保存」「预览」「删除」),你肯定需要在视图里判断是哪个按钮触发的提交。这时候:- 如果用
name="submit",很多Django的默认视图或者通用处理逻辑会默认检查这个键是否存在于request.POST中,比如一些基础的表单视图模板里,可能直接写if 'submit' in request.POST来判断提交动作。 - 如果用
name="button",你必须在视图里明确检查'button' in request.POST,因为它不是Django或HTML默认的提交标识,完全是自定义的命名。
举个视图里的代码例子:
# 处理name="submit"的按钮 if request.method == 'POST' and 'submit' in request.POST: form = MyForm(request.POST) if form.is_valid(): form.save() # 后续逻辑 # 处理name="button"的按钮 if request.method == 'POST' and 'button' in request.POST: form = MyForm(request.POST) if form.is_valid(): form.save() # 后续逻辑逻辑上是一致的,但前者更符合通用约定,其他开发者接手代码时更容易理解。
- 如果用
语义化与代码可读性
name="submit"的语义非常清晰——看到这个name就知道这是负责提交表单的按钮;而name="button"太宽泛了,尤其是在一个有多个按钮的表单里,这个命名完全体现不出按钮的作用,会增加代码维护的成本,别人得去看按钮的文本或者上下文才能明白它的功能。
总结一下:如果只是单个提交按钮,俩写法在Django里都能用,但name="submit"更符合标准和约定,可读性、兼容性更好;如果是多按钮场景,自定义更具语义的name(比如name="save"、name="delete")比name="button"更合理,而name="submit"可以作为主提交按钮的通用命名。
内容的提问来源于stack exchange,提问作者Wizard

