首页 > 解决方案 > Django 错误 NoReverseMatch at / Reverse for 'add-to-fav-songs' with arguments '('',)' not found

问题描述

所以我希望用户能够将歌曲添加到名为“最喜欢的歌曲”的部分(就像将产品添加到电子商务网站中的购物车一样),但我收到了这个错误NoReverseMatch at / Reverse for 'add-to-fav-songs' with arguments '('',)' not found. 1 pattern(s) tried: ['add\\-to\\-fav\\-songs/(?P<pk>[0-9]+)/$']。谁能更正我的代码并告诉我如何将歌曲添加到favorite songs. 提前致谢!

我的模型.py:

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

    def get_absolute_url(self):
        return reverse('/', kwargs={'pk': self.pk})

我的意见.py:

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

@login_required
def add_to_fav_songs(request):
    
    fav_song = get_object_or_404(Songs)

class Fav_songs(ListView):
    model = Songs
    template_name = 'fav_songs.html'
    context_object_name = 'fav_song'
    paginate_by = 2

    def get_queryset(self):
        return Songs.objects.filter(id=self.kwargs.get('pk'))

我的 urls.py:

path('add-to-fav-songs/<int:pk>/', views.add_to_fav_songs, name='add-to-fav-songs'),
path('favourite-songs/', Fav_songs.as_view(), name='favourite-songs'),

我的主页.html:

{% 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>
    <!-- <button> <a href="{% url 'add-to-fav-songs' object.id %}"></a> Add To Favourite Songs</button> -->
    <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="button"><span class="fa fa-heart"></span></button>
      </div>
    </form>
  </article>
{% endfor %}

我的 fav_songs.html:

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

      <h2><a class="article-title" href="{% url 'song-detail' song.id %}">{{ fav_song.title }}</a></h2>
      <div class="article-metadata">
        <a class="mr-2" href="{% url 'author-songs' 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 %}

标签: django

解决方案


您的代码中的第一个问题是您写道:

{% url 'add-to-fav-songs' object.id %}

这里的问题是上下文中没有变量object,因此object.id只是解析为一个空字符串,给你一个错误。您需要将其替换为song.id

{% url 'add-to-fav-songs' song.id %}

接下来,您尝试使用此注释来删除该错误代码:

<!-- <button> <a href="{% url 'add-to-fav-songs' object.id %}"></a> Add To Favourite Songs</button> -->

这里的问题是 Django 不关心 HTML 注释,它会尝试渲染它们并再次给你同样的错误。您可以删除此代码或使用comment模板标签 [Django docs]使 Django 实际上将其视为注释:

{% comment %}
    <button> <a href="{% url 'add-to-fav-songs' object.id %}"></a> Add To Favourite Songs</button>
{% endcomment %}

推荐阅读