【问题标题】:Jquery script in Django project isn't detecting form submissionDjango 项目中的 Jquery 脚本未检测到表单提交
【发布时间】:2020-07-29 00:13:36
【问题描述】:

我正在使用 Django 创建一个网站,并使用 Ajax 来防止在提交表单后重新加载网站。现在,我有订单显示在网站上,每个订单旁边都有一个 x 按钮。单击 x 会取消数据库上的订单(更改值而不是简单地删除它的发布请求)并且还会重新加载放置订单的 div。我在这个网站上有其他可以正常工作的表格(尽管它们确实有字段并且使用了crispyforms)。 我面临的问题是脚本没有检测到表单已提交。

以下是我项目的相关部分:

views.py

class CancelForm(ModelForm):
 class Meta:
    model = Order
    fields = ['Filled']
...
def cancelorder(request, pk):
    form = CancelForm(request.POST)
    if request.is_ajax and request.method == "POST":
        order = Order.objects.get(pk=pk)
        order.Filled = "C"
        instance = order.save(update_fields=["Filled"])
        return JsonResponse({"canceled": pk}, status=200)
    return JsonResponse({"error": ""}, status=400)

urls.py

urlpatterns = [
    path('', views.orderpage, name="order-index"),
    path('cancel_order/<int:pk>/', views.cancelorder, name="cancel_order"),
    path('post/ajax/order/', views.postorder, name = "post_order"),
    path('yourorders/', views.yourorders, name="your_orders"),
    path('allorders/', views.allorders, name="all_orders"),
]

orderpage.html(这是我的主页,在 yourorders.html 上要重新加载 div)

<div class="container-fluid ActiveOrderInfoDiv" id="YourOrdersDiv">
  {% include 'order/yourorders.html' %}
</div>

yourorders.html

{% for order in all_orders %}
  <div class="row">
...
    <div class="col">{{ order.OrderID }}</div>
    <form action="{% url 'order:cancel_order' pk=order.OrderID %}" id="cancel_button" method="POST">
      {% csrf_token %}
      <button type="submit" class="close" aria-label="Close">
        <span aria-hidden="true">&times;</span>
      </button>
    </form>
  </div>
  {% endfor %}

Javascript(此处,从未记录检查 2)

 $(document).ready(function () {
      $("#cancel_button").submit(function (e) {
          console.log("check 2");
          e.preventDefault();
          console.log("check 3");
          $.ajax({
            url: "{% url 'order:your_orders' %}",
            success: function (response) {
              $("#YourOrdersDiv").load("/order/yourorders/");
            },
            error: function (response) {
            }
          });
        });
    });

我的尝试

  • 将脚本移至 yourorders.html(我想也许 JS 没有看到 cancel_button ID)
  • 使用 console.log 查看流程停止的位置(似乎没有发现取消按钮已提交)
  • 添加了 CancelForm 模型表单(之前我在没有模型表单的情况下更新数据库)
  • 通常使用 Ajax 语法和顺序来探索
  • 查看 StackOverflow 上的其他问题 - 我似乎在关注它们,我的语法可能是正确的,只是没有发现正在提交 cancel_button 表单

【问题讨论】:

  • 表单是否已重新加载?绑定事件处理程序只会在页面加载时发生,如果重新加载表单,则新表单将不会绑定事件处理程序

标签: javascript python jquery django ajax


【解决方案1】:

您应该将事件处理程序委托给文档级别,以便在重新加载表单时仍然可以处理事件。当您“重新加载”表单时,您正在将一个新元素插入到没有附加事件处理程序的 DOM 中

$(document).on("submit", "#cancel_button", function(e) {
  ...

【讨论】:

  • 看起来这绕过了视图方法。根据日志,我可以看到 ajax 确实在运行(因此在 div 运行时页面不会重新加载),但 cancelorder 视图没有。注释掉“e.preventDefault();”允许 cancelorder 运行(但不阻止重新加载页面)
  • 如果您想异步执行所有操作,您需要在处理程序中调用取消订单视图
  • 好的,如果我理解正确,您是说我需要从 javascript 调用对应于正确视图的 url。我已经更新了上面 yourorders.html 的代码,表明 url 需要来自 for 循环的特定迭代的参数(对应于该行的主键)。有没有办法在我的处理程序中得到这个?感谢您的帮助。
  • 您在表单的action 中设置了正确的删除URL 对吧?您可以通过处理程序 e.target.action 中的事件对象访问它
  • 谢谢!对于其他有此问题的人,我将 'url: "{% url 'order:your_orders' %}"' 更改为 'url: e.target.action'
猜你喜欢
  • 2016-10-11
  • 2013-08-04
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多