首页 > 解决方案 > Django 歌曲未添加到“最喜欢的歌曲”中

问题描述

我希望我的用户能够添加某些歌曲,Favourite Songs但是success message 'Added to favourite songs'当我访问该Favourite 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, **kwargs):
    
    fav_song = Songs.objects.filter(id=kwargs.get('id'))
    messages.success(request, f'Added to favourite songs')
    return redirect('/')

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(pk=self.kwargs.get('pk'))

我的 favoutie_songs.html:

{% for song in fav_song %}
  <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>
  </article>
{% endfor %}

标签: django

解决方案


Song未连接到User,因此您永远不会跟踪用户最喜欢的歌曲。

你应该在ManyToManyField你的Song模型中添加一个:

from django.conf import settings

class Songs(models.Model):
    # …
    favorited_by = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='favorite_songs'
    )
    # …

然后在我们的视图中,我们可以将登录用户添加到该favorited_by字段。由于我们在这里更改数据,这应该通过 POST 请求来完成:

from django.contrib.auth.decorators import loginrequired
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_http_methods

@login_required
@require_POST
def add_to_fav_songs(request, pk):
    fav_song = get_object_or_404(Songs, id=pk)
    fav_song.favorited_by.add(request.user)
    messages.success(request, 'Added to favourite songs')
    return redirect('/')

对于ListView,我们可以按登录用户进行过滤:

from django.contrib.auth.mixins import LoginRequiredMixin

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

    def get_queryset(self):
        return Songs.objects.filter(favorited_by=self.request.user)

您应该更改按钮以将其添加到收藏夹中:

<form method="post" action="{% url 'add-to-fav-songs' song.id %}">
    <button class="btn btn-danger" type="submit">Add to Favorite Songs</button>
</form>

注意:您可以使用LoginRequiredMixinmixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。


推荐阅读