从 Django 中的表单发送 DELETE 请求

2023-12-14

我正在尝试从 Django 中的表单发送 DELETE 请求,并从 jQuery 获取帮助,参考下面的链接;

https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/

我所拥有的是以下脚本;

<script src="jquery-1.11.3.js"></script>

<script>
  $(document).ready(function(){
    $.ajax({
      id : 'delete',
      headers : {'X_METHODOVERRIDE': 'DELETE'}
    });
  });
</script>

(我打算)按照以下表格行事;

<form method="post" id="delete" name="delete" action="">
  {% csrf_token %}
  <input type="submit" value="Delete" />
</form>

以及以下中间件;

from django.http import QueryDict

class HttpPostTunnelingMiddleware(object):
    def process_request(self, request):
        if request.META.has_key('HTTP_X_METHODOVERRIDE'):
            http_method = request.META['HTTP_X_METHODOVERRIDE']
            if http_method.lower() == 'put':
                request.method  = 'PUT'
                request.META['REQUEST_METHOD'] = 'PUT'
                request.PUT = QueryDict(request.body)
            if http_method.lower() == 'delete':
                request.method  = 'DELETE'
                request.META['REQUEST_METHOD'] = 'DELETE'
                request.DELETE = QueryDict(request.body)
        return None        

我已将其添加到我的 settings.py 中的 MIDDLEWARE_CLASSES 列表中;

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'stationrunner.middleware.HttpPostTunnelingMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

这是第三个条目,之前CsrfViewMiddleware考虑@Daniel Roseman 的话。

最后,在我的基于类的视图中,我使用删除方法删除相应的对象;

class StationHome(View):
    .
    .
    .
    def post(self,request, pk):
        station = Station.objects.get(pk=pk)
        form = StationForm(request.POST, instance=station)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse("home_station",
                                                kwargs={'pk':pk},
                                            )
                                    )
        else:
            return HttpResponse("Form Invalid!")

    def delete(self, request, pk):
        Station.objects.get(pk=pk).delete()
        return HttpResponseRedirect(
            reverse("list_create_station")                      
            )
    .
    .

我希望中间件和脚本发出一个发送到视图的删除请求,但事情并没有发生。正在发送 POST 方法本身。 Django 发现一个无效的表单并给了我响应; “表格无效!” (else: return HttpResponse("Form Invalid!")

Update

我已将脚本更新为如下所示:

<script>
  $(document).ready(function(){
    $('#delete').submit.function(e){
      e.preventDefault();
      var station_id = {{ station.id }}
      $.ajax({
        type: 'POST',
        url: '/station/' + station_id,
        headers: {'X_METHODOVERRIDE': 'DELETE'}
      });
    });
  });
</script>

我将对象传递给模板station我在脚本中使用了 Django 模板语言(var station_id = {{ station.id }})从中汲取灵感https://stackoverflow.com/a/6008968/4672736

结果是一样的 :/

Update

调试js发现浏览器没有找到jQuery文件。现在,静态文件已正确配置,并且在 jquery.cookie.js 的帮助下设置了 csrf 保护,我的模板中包含以下代码;

<script src="{% static "stationrunner/jquery-1.11.3.js" %}"></script>
<script src="{% static "stationrunner/jquery.cookie.js" %}"></script>

<script>
  $(document).ready(function(){
    var csrftoken = $.cookie('csrftoken');
    function csrfSafeMethod(method) {
      // these HTTP methods don't require CSRF protection
      return(/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
      beforeSend: function(xhr, settings) {
        if(!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
      }
    });
    $('#delete').submit(function(e){
      e.preventDefault();
      $.ajax({
        type: 'POST',
        url: '{% url 'home_station' station.id %}',
        headers: {'X_METHODOVERRIDE': 'DELETE'}
      });
    });
  });
</script>

现在我的前端没有错误,但还没有成功。提交表格后我可以得到200响应而不是302.

这是 AJAX 请求所期望的吗?

看来该请求尚未作为删除请求传递到视图。

我尝试添加success: function(){alert('Object deleted!')} to $.ajax并且警报确实弹出。

Update

最后的障碍是我必须在传递的自定义标头中使用破折号而不是下划线。我变了headers: { 'X_METHODOVERRIDE': 'DELETE' } to headers: { 'X-METHODOVERRIDE': 'DELETE' }。这些字母也不必以大写字母传递。无论如何,Django 都会将它们转换为大写字母。所以x-methodoverride or x-MeThODoveRrIDE就此而言也很好。我不知道为什么用破折号而不是下划线。我发现当其他标题通过时带有破折号而不是下划线。

早些时候,中间件没有找到密钥HTTP_X_METHODOVERRIDE。现在它出现了,我的视图收到了删除请求:)


问题出在你的 javascript 代码上。您将表单作为常规 POST 请求提交,根本不使用 $.ajax javascript 代码。

您应该将 jquery 包含在单独的脚本标记中,如下所示:

<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>

然后在另一个脚本标签中放置代码:

<script>
    $('#delete').submit(function(e) {
        // do NOT submit the form as a regular POST request
        e.preventDefault();
        var object_to_delete_id = $('#object_to_delete_id').val();
        $.ajax({
            type: 'POST',
            url: '/your-view-url/' + object_to_delete_id,
            success: function() {
                alert('Object deleted!')
            },
            headers: { 'X_METHODOVERRIDE': 'DELETE' }
        });
    });
<script>

在这里,我假设您在表单字段中有要删除的对象的 id,如下所示:

<form method="post" id="delete" name="delete" action="">
  {% csrf_token %}
  <input type="text" id="object_to_delete_id" />
  <input type="submit" value="Delete" />
</form>

请注意 Ajax 调用上的 Django CSRF 保护,您应该编写一些 javascript 来在请求中设置 CSRF cookie 值,如中所述Django 文档.

另外,将 HttpResponseRedirect 返回到 Ajax 调用没有多大意义,因为浏览器不会像常规 POST 请求那样重定向到该页面。

我建议在深入研究像这样的更复杂的示例之前,先多研究一下 jquery 和 Ajax 请求的工作原理。 ;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Django 中的表单发送 DELETE 请求 的相关文章

随机推荐

  • 批处理文件taskkill /IM cmd.exe未关闭cmd.exe

    我有一个批处理文件 它移动几个文件并启动一个程序 由于某种原因 在批处理文件执行完其中的所有命令后 它不会关闭 命令提示符在屏幕上保持打开状态 因此我想将其关闭 我尝试在批处理文件末尾输入 taskkill IM cmd exe 作为最后一
  • 如何将所有变量添加到 lm() 中的第二级? [复制]

    这个问题在这里已经有答案了 我有一个包含 16 个变量的数据框 当我进行多元线性回归时 我会执行以下操作 fit lt lm y data data 现在 我知道如何添加其中一个变量的二阶项 fit2 lt lm y poly x1 2 d
  • Java中的用户输入字符串和整数[重复]

    这个问题已经存在了 System out print Name String name in nextLine System out print Age int age in nextInt System out print City St
  • 通过代理curl不返回任何内容

    我现在正在编写一个 PHP 脚本 该脚本向我们学校的服务器发送请求 以获取有关不同课程班级规模的实时信息 当我不使用代理时 该脚本运行得非常好 返回一个包含课程编号和可用座位的字符串 不过 我想让这个为学生提供服务 我担心如果我发出太多请求
  • 如何根据列值组合检索唯一行?

    我有一张桌子mytable像下面这样 product tag lot 1111 101 2 1111 102 5 2222 103 6 3333 104 2 4444 101 2 5555 101 2 5555 102 5 6666 102
  • 确保您使用为位于“dir:\projectPath\venv\Scripts\python.exe”的 Python 解释器安装的正确版本的“pip”

    我正在使用 python 3 6 5 和 PyCharm 尝试安装任何软件包时 都会出现错误 尝试从系统终端运行此命令 确保使用为位于 C projectPath venv Scripts python exe 的 Python 解释器安装
  • Spark 忽略 SPARK_WORKER_MEMORY?

    我使用的是独立集群模式 1 5 2 即使我正在设置SPARK WORKER MEMORY in spark env sh 看起来这个设置被忽略了 我在下面的脚本中找不到任何指示bin sbin that Xms Xmx已设置 如果我使用ps
  • 如何将自定义日期时间格式转换为时间戳?

    知道为什么我得到下面的结果吗 scala gt val b to timestamp DATETIME ddMMMYYYY HH mm ss b org apache spark sql Column to timestamp DATETI
  • 如何在 Android 自定义键盘中动态更改按键的背景颜色或主题

    我正在开发自定义键盘应用程序 我需要设置或更改键盘的背景主题或颜色 应用程序中的setting xml 视图 用户可以在其中选择不同的背景主题和关键行的不同颜色 在第一次启动应用程序期间 它工作正常 但下次自定义键盘显示主题时不会更改 我正
  • 填充 RecyclerView 时出现 ArrayIndexOutOfBoundsException

    当我尝试填充 RecyclerView 时 我经常收到错误 但该错误似乎发生在内部StaggeredGridLayoutManager 我从数据库填充 RecyclerView 然后使用此将图像添加到我的适配器 List
  • mysql:将分数字符串转换为数字

    我有像 3 4 和 5 9 这样的字符串 还有一些像 1 2 km 和 3 4 Degree 存储在mysql列中 我想将它们转换成数字 在第一种情况下 3 4 gt 0 75 在更复杂的第二种情况下 去掉 公里 和 度 等单位 这样 1
  • 显示隐藏键盘在 Android PhoneGap 中无法正常工作

    我按照此链接使用 Simon mac donald Defination 1 来使用键盘事件 在这种情况下 当键盘隐藏时我会显示我的页脚 当键盘显示时我会隐藏我的页脚 字典我的键盘是show但事件是转到键盘hide功能 所以我的页脚显示 我
  • 使用 Javascript 的仅会话 cookie

    我想知道是否可以使用 Javascript 创建仅会话 cookie 当浏览器关闭时 cookies 应该被删除 我无法在服务器上使用任何内容 因为该网站仅是 HTML 所以没有使用服务器端脚本 我在这里读到了一些相关内容 http blo
  • 埃拉托斯特尼筛法 - 寻找素数 Python

    只是澄清一下 这不是作业问题 我想为我正在构建并遇到的数学应用程序找到素数埃拉托斯特尼筛法方法 我已经用 Python 编写了它的实现 但速度非常慢 比如说 如果我想找到所有小于 200 万的素数 需要 gt 20 分钟 我此时停止了 我怎
  • WPF 日历:绑定到 MVVM 命令?

    我正在将 WPF 日历连接到 MVVM 视图模型 我不确定如何将日期选择和月份更改绑定到 MVVM ICommand 对象 例如 要处理选定的日期更改 我将在 XAML 中将什么对象绑定到视图模型中相应的命令属性 据我所知 我被代码隐藏中的
  • 动态惰性列表

    大家好 我想做this懒惰者动态 我首先尝试过使用图像 但它会强制关闭 如果我的方法有误 请指导 这是代码 public class Test extends Activity ListView list LazyAdapter adapt
  • Breeze.js 混合 DTO 和实体

    在沃德的文章中 Breeze 服务器 随心所欲 典型的业务应用程序至少有 200 个领域模型 类型 90 以上的时间我通过网络发送的数据的形状 电线与我的商业模型中实体的形状相同 当客户实体的形状与实体的形状不一致时 服务器端业务实体 我可
  • Android studio - 应用程序在跨步时崩溃

    当我在调试模式下进行单步执行 快捷键 F8 时 我在 Android studio 中遇到崩溃 如果我设置断点 那么它会跳转到下一个断点 使用快捷键 F9 我遇到以下错误 A zygote jdwp handler cc 1221 Chec
  • 使用“set time_zone = ...”连接到数据库后更改时区

    我试图在连接到数据库后立即将时区更改为 欧洲 伦敦 这是我原来的代码 pdo new PDO mysql host localhost dbname exampletable exampleuser examplepassw array P
  • 从 Django 中的表单发送 DELETE 请求

    我正在尝试从 Django 中的表单发送 DELETE 请求 并从 jQuery 获取帮助 参考下面的链接 https baxeico wordpress com 2014 06 25 put and delete http request