• 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="150px;height:40;font-size:14px;padding:5px;margin:10px;"/>
    <input type="submit" value="下一步" onclick="return checkform()" style="150px;height:40;font-size:14px;padding:5px;margin:10px;"/>


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


    总结:用JS,等于将逻辑前移,在JS失效的时候会产生错误。对于一个表单多个按钮的情况,个人认为最好的处理方式是Forrest Liu 的解决办法。而多个表单,同一个handler的情况,用多个hidden的input来处理。
  • 相关阅读:
    如何创建支持64位的安装程序
    SharePoint Server 2013开发之旅(四):配置工作流开发和测试环境
    SharePoint Server 2013开发之旅(三):为SharePoint Server配置App开发、部署、管理环境
    SharePoint Server 2013开发之旅(二):使用在线的开发人员网站进行SharePoint App开发
    SharePoint Server 2013开发之旅(一):新的开发平台和典型开发场景介绍
    在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
    一个在ASP.NET中利用服务器控件GridView实现数据增删改查的例子
    关于未捕获异常的处理(WPF)
    牛刀小试:使用Reactive Extensions(Rx),对短时间内多次发生的事件限流
    如何对SharePoint网站进行预热(warmup)以提高响应速度
  • 原文地址:https://www.cnblogs.com/crafter/p/2262908.html
Copyright © 2020-2023  润新知