django中如何优雅的处理一个多按钮的表单

1.     一个表单多个按钮
OA MATSUI 的问题:
如过一个html表单,包含一个书的列表信息,有两个按钮,
一个是添加,一个是修改,实现不同的功能,代码如下。
<form action="/booklist/" method="post">
<table border="1" width="80%">
<tr>
<th></th>
<th>书名</th>
<th>作者</th>
<th>日期</th>
</tr>
{% for booklist in codelists %}
{{ booklist.full_name|upper }}
<tr>
<td><input type="radio" name="value" value="{{ booklist.key }}"></td>
<td>{{booklist.fstateid}}</td>
<td>{{booklist.fstatename}}</td>
<td>{{booklist.fnexttime}}</td>
</tr>
{% endfor %}
</table>
<p>
<input type="submit" name="subsat" value="新增" class="button"></input>
<input type="submit" name="subsat" value="编辑" class="button"></input>
</form>

我现在的做法是根据post信息中按钮的value值,判断用户点了什么按钮,修改根据post中的Key值。
不太满意的地方是在 后端必须依靠两个按钮的utf-8编码,判断是"新增"还是"编辑",不是很
直观和方便,请问是否有更好的办法(不用JS的情况下)。
Forrest Liu 的解决办法:
<input type="submit" name="new" value="新增" class="button"></input>
<input type="submit" name="edit" value="编辑" class="button"></input>
if request.POST.has_key("new"):
.....
if request.POST.has_key("edit"):


Zhang Jiawei 的解决办法:
一个表单,两个按钮,点击按钮的时候跑一下js, 修改表单的 action 地址。
/booklist/edit
/booklist/new
这样你的 url mapping 可以对应到后台的两个 handler, 也就不用写什么 if/else 判断按钮了。

如果你有10个按钮,写10个if/else 真是很悲惨的事情。再更进一步,我都希望你的那个按钮按下的时候,调用的是 ajax call,
然后用 dom api 直接局部更新你的表单。

2.     多个表单,同一个handler
每个Form都有一个hidden
<input id="action" name="action" type="hidden" value="add">
<input id="action" name="action" type="hidden" value="edit">

提交到同一个View,view里面这样判断:
if request.POST['action'] == 'add':
add
elif request.POST['action'] == 'edit':
edit


我们的应用场景:
下一步、保存并继续编辑 两种提交,是一个表单多个按钮

我们现在的做法:
<input id="action" name="action" type="hidden" value="">
<input type="submit" value="保存并继续编辑" onclick="$('#action').attr('value', 'save');$('form').submit();" style="width:150px;height:40;font-size:14px;padding:5px;margin:10px;"/>
<input type="submit" value="下一步" onclick="return checkform()" style="width:150px;height:40;font-size:14px;padding:5px;margin:10px;"/>


用的是JS,不过不是更改form的action属性,而是更改的一个hidden的input的值。


总结:用JS,等于将逻辑前移,在JS失效的时候会产生错误。对于一个表单多个按钮的情况,个人认为最好的处理方式是Forrest Liu 的解决办法。而多个表单,同一个handler的情况,用多个hidden的input来处理。

posted on 2011-09-18 15:41  ddper  阅读(3680)  评论(0编辑  收藏  举报

导航