Django歌曲未添加到"最喜欢的歌曲"中

  • 本文关键字:喜欢 添加 Django 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'))

我最喜欢的歌曲.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 %}

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

您应该使用以下将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)

你应该更改按钮,将其添加到迷你模型的收藏夹中:

<formmethod="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]。