You need to enable JavaScript to run this app. Django报NoReverseMatch错误如何实现歌曲添加到收藏歌单功能
优惠活动
大模型
产品
解决方案
定价
更多

Django报NoReverseMatch错误如何实现歌曲添加到收藏歌单功能

报错原因与功能完整修正方案

你遇到的NoReverseMatch报错直接原因是home.html中被注释的代码{% url 'add-to-fav-songs' object.id %}仍然会被Django模板引擎解析,当前循环里没有object变量,导致传入空值匹配不上需要数字pk的路由,先删除这行注释代码即可解决报错。
以下是完整的收藏功能修正步骤:


1. 修正models.py,新增用户收藏关联表

你当前缺少存储用户和收藏歌曲对应关系的表,需要新增关联表避免逻辑缺失:

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

class Songs(models.Model):
    title = models.CharField(max_length = 100)
    lyrics = models.TextField()
    author = models.CharField(max_length = 100)
    track_image = models.CharField(max_length=2083)

    def __str__(self):
        return self.title

    # 修正原错误的get_absolute_url,reverse参数为路由名而非路径
    def get_absolute_url(self):
        return reverse('song-detail', kwargs={'pk': self.pk})

# 新增用户收藏中间表,避免同一用户重复收藏同一首歌
class UserFavSongs(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="fav_songs")
    song = models.ForeignKey(Songs, on_delete=models.CASCADE)
    class Meta:
        unique_together = ('user', 'song')

2. 修正views.py逻辑

原视图没有处理收藏存储逻辑,收藏列表查询规则也错误:

from django.shortcuts import get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView
from .models import Songs, UserFavSongs

def home(request):
    context = {
        'songs': Songs.objects.all()
    }
    return render(request, 'home.html', context)

# 接收路由传入的pk参数,完成收藏存储
@login_required
def add_to_fav_songs(request, pk):
    song = get_object_or_404(Songs, pk=pk)
    UserFavSongs.objects.get_or_create(user=request.user, song=song)
    # 收藏后跳转回首页,也可修改为跳转至收藏页
    return redirect('home')

class Fav_songs(ListView):
    model = Songs
    template_name = 'fav_songs.html'
    context_object_name = 'songs' # 与模板循环变量对齐
    paginate_by = 2

    # 仅查询当前登录用户的收藏歌曲
    def get_queryset(self):
        return Songs.objects.filter(userfavsongs__user=self.request.user)

3. 修正home.html模板

除删除错误注释代码外,要修改按钮类型为submit才能触发表单提交:

{% for song in songs %}
  <article class="media content-section">
    <div class="media-body">
      
      <h2><a class="article-title" href="{% url 'song-detail' song.id %}">{{ song.title }}</a></h2>
      <div class="article-metadata">
        <a class="mr-2" href="{% url 'author-songs' song.author %}">{{ song.author }}</a>
      </div>
      <br>
      <img class="card-img-bottom" height="339px" width="20px" src="{{ song.track_image }}">
    </div>
    <form class="form" method="POST" action="{% url 'add-to-fav-songs' song.id %}">
      {% csrf_token %}
      <div class="action">
        <button class="like btn btn-danger" type="submit"><span class="fa fa-heart"></span> 收藏</button>
      </div>
    </form>
  </article>
{% endfor %}

4. 修正fav_songs.html模板

原模板循环变量引用错误,统一使用循环变量fav_song:

{% for fav_song in songs %}
  <article class="media content-section">
    <div class="media-body">

      <h2><a class="article-title" href="{% url 'song-detail' fav_song.id %}">{{ fav_song.title }}</a></h2>
      <div class="article-metadata">
        <a class="mr-2" href="{% url 'author-songs' fav_song.author %}">{{ fav_song.author }}</a>
      </div>
      <br>
      <img class="card-img-bottom" height="339px" width="20px" src="{{ fav_song.track_image }}">
    </div>
  </article>
{% endfor %}

5. 执行数据库迁移

修改完模型后执行以下命令更新数据库结构:

python manage.py makemigrations
python manage.py migrate

修改完成后即可正常使用收藏功能,点击收藏按钮会将当前歌曲加入登录用户的收藏列表,访问/favourite-songs/可查看所有收藏的歌曲。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 21:27:03