Django音乐web应用移除收藏功能报song_id类型错误求助
报错根因
直接触发报错的原因是:移除收藏的表单没有正确传递数字类型的song_id参数,反而将提交按钮的文本值Remove from Favourites传递到了视图期望接收数字song_id的位置,触发了类型不匹配错误。
同时代码还存在以下多个逻辑错误:
- Song模型的主键为自定义的
song_id,模板中错误使用{{song.id}}无法获取到有效值 - 移除收藏的表单未设置
action属性,无法将请求发送到对应视图路由 - 视图逻辑错误删除了歌曲本身的
Song记录,而非删除用户的Favourites收藏关联记录 - 查询时错误使用不存在的
id字段过滤Song模型
修复步骤
1. 修复前端移除收藏模板
将原有移除表单替换为以下代码:
<form action="{% url 'remove_from_favourite' song.song_id %}" method="post"> {% csrf_token %} <button type="submit" class="btn btn-outline-danger">Remove from Favourites</button> </form>
2. 配置对应路由(music/urls.py)
添加移除收藏功能的路由规则:
from django.urls import path from . import views urlpatterns = [ # 保留原有其他路由配置 path('remove_fav/<int:song_id>/', views.remove_from_favourite, name='remove_from_favourite'), ]
3. 修复移除收藏视图逻辑
替换原有remove_from_favourite函数,仅删除用户的收藏关联记录,不要删除歌曲本身:
def remove_from_favourite(request, song_id): if request.method == "POST": # 过滤当前用户对指定歌曲的收藏记录并删除 Favourites.objects.filter(user=request.user, video_id=str(song_id)).delete() messages.success(request, "Removed from favorite!") # 跳转回收藏列表页即可,无需传递song_id参数 return redirect('favourite')
内容的提问来源于stack exchange,提问作者Arif Hossain
相关产品推荐
相关产品推荐

