You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板循环删除视频时始终返回首个ID的问题求助

问题排查与解决方案

1. 检查模板中删除按钮/表单的ID与绑定逻辑

如果用JavaScript绑定删除事件,循环内按钮/表单ID重复是最常见诱因。比如模板里写了:

{% for video in video_list %}
  <button id="delete-btn">删除</button>
{% endfor %}

此时通过getElementById('delete-btn')只能获取第一个元素。

解决方法:

  • 给每个按钮设置唯一ID,用视频ID拼接:
    {% for video in video_list %}
      <button id="delete-btn-{{ video.id }}">删除</button>
    {% endfor %}
    
  • 或者用事件委托绑定父元素,通过data属性传递ID:
    document.querySelector('.video-list').addEventListener('click', function(e) {
      if (e.target.classList.contains('delete-btn')) {
        const videoId = e.target.dataset.videoId;
        // 发起删除请求逻辑
      }
    });
    
    模板对应写法:
    {% for video in video_list %}
      <button class="delete-btn" data-video-id="{{ video.id }}">删除</button>
    {% endfor %}
    

2. 确认删除请求的URL是否正确传递ID

如果用表单POST请求,检查action属性是否正确带入当前视频ID:
错误示例(未传递ID):

{% for video in video_list %}
  <form method="post" action="{% url 'delete_video' %}">
    {% csrf_token %}
    <button type="submit">删除</button>
  </form>
{% endfor %}

正确写法:

{% for video in video_list %}
  <form method="post" action="{% url 'delete_video' video.id %}">
    {% csrf_token %}
    <button type="submit">删除</button>
  </form>
{% endfor %}

对应urls.py需配置带参数的路径:

path('video/delete/<int:video_id>/', VideoDeleteView.as_view(), name='delete_video'),

3. 检查视图类中ID的获取逻辑

如果用DeleteView基类,需指定pk_url_kwarg匹配URL参数:

from django.views.generic import DeleteView
from .models import Video

class VideoDeleteView(DeleteView):
    model = Video
    pk_url_kwarg = 'video_id'  # 对应urls中的参数名
    success_url = '/video/manage/'  # 删除后跳转页面

如果是自定义视图,确保正确从URL取参数:

from django.http import HttpResponseRedirect
from .models import Video
from django.views import View

class VideoDeleteView(View):
    def post(self, request, video_id):
        Video.objects.filter(id=video_id).delete()
        return HttpResponseRedirect('/video/manage/')

4. 排查全局重复表单元素

若循环外存在同名隐藏input,会导致提交时覆盖参数。确保每个表单的隐藏字段(如果使用)在循环内:

{% for video in video_list %}
  <form method="post" action="{% url 'delete_video' %}">
    {% csrf_token %}
    <input type="hidden" name="video_id" value="{{ video.id }}">
    <button type="submit">删除</button>
  </form>
{% endfor %}

再次确认每个表单都完整包裹在{% for %}与{% endfor %}之间。


内容的提问来源于stack exchange,提问作者LaHarmendad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:10:25