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
相关产品推荐
相关产品推荐

