📜  django 在提交时不重定向 - Python (1)

📅  最后修改于: 2023-12-03 15:14:43.990000             🧑  作者: Mango

Django 在提交时不重定向 - Python

在 Django 中,当用户提交表单时,默认情况下,Django 会通过重定向将用户重定向到成功提交的页面。然而,有时候我们可能希望在提交表单后保持在同一页面,而不进行任何重定向。本文将介绍如何在 Django 中实现在提交时不重定向的方法。

方法一:使用 Ajax 异步提交表单

一种常见的方法是使用 Ajax 来提交表单数据,并在提交后保持在同一页面。具体的步骤如下:

  1. 在页面中引入 jQuery 库:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  1. 创建一个 JavaScript 函数来处理表单提交事件:
<script>
  $(document).ready(function() {
    $('#my-form').on('submit', function(event) {
      event.preventDefault();  // 阻止表单默认的提交行为
      var formData = $(this).serialize();  // 获取表单数据
      $.ajax({
        url: '/submit/',  // 表单提交的 URL
        type: 'post',
        data: formData,
        success: function(response) {
          // 处理提交成功后的操作,例如显示成功消息
          $('#result-message').text('提交成功!');
        },
        error: function(response) {
          // 处理提交失败后的操作,例如显示错误消息
          $('#result-message').text('提交失败,请重试!');
        }
      });
    });
  });
</script>
  1. 在 HTML 表单中指定表单的 id 和对应的 URL:
<form id="my-form" action="/submit/" method="post">
  <!-- 表单字段 -->
  <button type="submit">提交</button>
</form>
<div id="result-message"></div>

在上面的代码中,我们使用了 jQuery 的 Ajax 方法来发送异步请求。在成功或失败的回调函数中,可以根据服务器返回的响应结果进行相应的处理。

方法二:使用 Django 的 FormView 类视图

另一种处理在提交时不重定向的方法是使用 Django 的 FormView 类视图。这个视图类提供了一种更优雅的方法来处理表单的提交,并且可以轻松地进行自定义。

首先,在views.py中定义一个继承自FormView的视图类,并设置相应的表单类、模板和成功提交后的操作:

from django.views.generic.edit import FormView
from myapp.forms import MyForm

class MyFormView(FormView):
    form_class = MyForm  # 自定义的表单类
    template_name = 'myapp/my_form.html'  # 表单的模板文件
    success_url = '/success/'  # 成功提交后重定向的 URL

    def form_valid(self, form):
        form.save()  # 保存表单数据
        return super().form_valid(form)

然后,在urls.py中将这个视图类与 URL 路径进行关联:

from django.urls import path
from myapp.views import MyFormView

urlpatterns = [
    path('submit/', MyFormView.as_view(), name='my_form'),
]

最后,在表单的模板文件my_form.html中,可以通过添加一些 JS 代码来阻止默认的表单提交行为:

<form id="my-form" action="{% url 'my_form' %}" method="post">
  {% csrf_token %}
  <!-- 表单字段 -->
  <button type="submit">提交</button>
</form>

通过以上的设置,当用户提交表单时,页面不会发生重定向,而是通过 Ajax 或 Django 的 FormView 处理表单数据,并在提交成功后执行相应的操作。

以上是在 Django 中实现在提交时不重定向的两种方法,可以根据实际需求选择适合的方法来处理表单提交。