预计所需阅读时间:10分钟
之前修改的商城订单列表页是这样的:
做完了列表页面,然后加了取消订单的功能,这个用的方法就比较简单,每个订单对应的取消按钮绑定一个链接,发送Post请求到后台的视图函数,然后改变订单状态为“已取消”,然后返回json到前端,JS来修改网页状态即可。
如果是修改订单、端口、用户、文章这些功能,一般都会跳转到另外的修改页面去修改。但这次我想用modal模态窗口实现发货功能,在弹出来的模态窗口上填写物流公司与物流订单号码。
这个依照Bootstrap4前端框架的规则很快就添加上了,然后为编写对应的视图函数和Javascript的。但是,发现这个功能差没有生效。第一原因,是多个订单使用同一个模太窗口,传到后台的数据无法一一对应。于是用模版语法生成多个模态窗口:
{% for order in pagination.items %} <div class="modal fade" id="sendOrder_{{ order.id }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">物流信息</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p class="d-none" id="orderId_{{ order.id }}">{{ order.id }}</p> <div class="form-group"> <label for="logis_company_{{ order.id }}">物流公司:</label> <input class="form-control logis_company" type="text" id="logis_company_{{ order.id }}" placeholder="请填写公司名称"> </div> <div class="form-group"> <label for="logis_number_{{ order.id }}">物流单号:</label> <input class="form-control logis_number" type="text" id="logis_number_{{ order.id }}" placeholder="请填写物流订单号码"> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> <button type="button" id="logis_save_{{ order.id }}" class="btn btn-primary logis_save" >保存 </button> </div> </div> </div> </div> {% endfor %} // 发货按钮也要在一下模版的循环语法之内 <button type="button" class="btn btn-info btn-sm btn-primary logis_send" data-toggle="modal" data-remote="{{ order.id }}" data-target="#sendOrder_{{ order.id }}"> 发货 </button>
不同的发货按钮对应不同的模态窗口,也有不同的ID,虽然它们看起来窗口的界面是一样的。
但是,即使这样,我调了JS很久也无法将填写好物流信息发送到到后台的视图函数,经过一番思考,没实现功能的第二个原因是订单号没有变成一个Javascript变量,用一个JS函数来处理,再传到后台。因为不同的模态窗口之中的保存按钮是不同。如果用$('.logis_save').on("click", function (event) {...}
的方式来选择按钮并绑定点击事件,这样是选择到了多个按钮,但实际要估的事件是不一样的——给不同的订单发货,所以不同的按钮要绑定不同的事件。当然,如果您有更高明的方法和思路也欢迎指出来。
于是我再用模版语法的循环写了不同的JS函数,对应不同的保存按钮的功能:
// 提交物流信息 {% for order in pagination.items %} $(function () { $("#logis_save_{{ order.id }}").on("click", function (event) { console.log("{{ order.id }}_ok") logis_company = $("#logis_company_{{ order.id }}").val() logis_number = $("#logis_number_{{ order.id }}").val() url = "/admin/order/logis_edit/" + {{ order.id }} console.log(logis_company, logis_number, url) if (logis_company == "") { $("#logis_company_{{ order.id }}").focus() return false } if (logis_number == "") { $("#logis_number_{{ order.id }}").focus() return false } $.ajax({ type: "post", url: url, data: { 'logis_company': logis_company, 'logis_number': logis_number, }, dataType: "json", beforeSend: function (xhr) { xhr.setRequestHeader("X-CSRFToken", csrf_token) }, success: function (data) { $("#logis_company_{{ order.id }}").val("") $("#logis_number_{{ order.id }}").val("") if (data.result == "saved") { window.location.reload() } } }) }) }) {% endfor %}
不用的模态窗口意味它们有不同的表单,用logis_number = $("#logis_number_{{ order.id }}").val()
来获取不同的物流单号。如果没有填写对应的信息,则用$("#logis_number_{{ order.id }}").focus()
设为焦点,让使用者补充完物流信息。
这样,最终在Flask框架里,在订单列表页面用modal模态窗口实现了发货功能。
评论