我希望我的用户能够将某些歌曲添加到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>
注意:您可以使用
LoginRequiredMixin
mixin[Django-doc]。