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

Django中传递player.id至HTML URL时页面崩溃问题求助

Django传递player.id到URL引发页面崩溃的解决方法

问题场景

刚接触Django,遇到一个奇怪的问题:模板里能正常显示player.id,但把它传到{% url 'delete' player.id %}里时页面直接崩溃。如果把URL里的player.id去掉,页面能正常加载,但删除功能就用不了了。

原模板代码

{% for player in all_players%}
<li>{{player.player_name|capfirst}} scored {{player.player_score}} and the id {{player.id}}!</li>
<div class="link" id="link"> <a href="{% url 'delete' player.id %}"> delete </a></div>
{% endfor %}

原urls.py配置

urlpatterns = [
    path('first', views.first, name='first'),
    path('delete/int:player_id', views.delete, name='delete'),
    path('third', views.third, name='third'),
    path('second/int:player_id', views.second, name='second'),
    path('', views.index, name='index'),
]

原views.py的delete函数

def delete(request, player_id): 
  player = Player.players_objects.get(id=player_id)
  player.delete()
  return render(request, 'all_players.html', {'player': player})

问题根源及修正方案

1. URL路径参数语法错误(核心问题)

Django的path()函数定义路径参数时,必须用**尖括号<>**把参数规则包起来,你写的delete/int:player_id会被当成普通字符串路径,导致反向解析URL时找不到匹配的路由,直接引发页面崩溃。

修正后的urls.py

urlpatterns = [
    path('first/', views.first, name='first'),
    # 修正参数语法,同时加上末尾斜杠(符合Django规范)
    path('delete/<int:player_id>/', views.delete, name='delete'),
    path('third/', views.third, name='third'),
    path('second/<int:player_id>/', views.second, name='second'),
    path('', views.index, name='index'),
]

2. 删除后传递已失效的对象到模板

你在删除player对象后,还把这个已经从数据库移除的对象传给模板,此时对象的属性已经无法正常访问,会引发数据库相关错误。正确做法是删除后重定向到玩家列表页面,而不是渲染模板。

3. 模型管理器可能存在错误

代码里用了Player.players_objects.get,如果你的Player模型没有自定义名为players_objects的管理器,应该用默认的Player.objects.get,否则会抛出属性不存在的错误。

修正后的views.py delete函数

from django.shortcuts import redirect, get_object_or_404

def delete(request, player_id): 
    # 用get_object_or_404替代直接get,ID不存在时返回友好的404页面
    player = get_object_or_404(Player, id=player_id)
    # 如果确实有自定义管理器,才用players_objects,否则改成objects
    # player = Player.objects.get(id=player_id)
    player.delete()
    # 重定向到玩家列表页(假设index是列表页,根据你的实际路由调整name)
    return redirect('index')

额外优化建议

  • 模板里的id="link"不要循环生成,ID应该是唯一的,改成用class即可。
  • 删除操作建议用POST请求(避免误触),可以把链接改成表单提交,或者用AJAX,但刚学的话先解决当前问题即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:16:06