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'))
我的 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 %}
解决方案
您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>
注意:您可以使用
LoginRequiredMixin
mixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。
推荐阅读
- r - 删除异常值的用户函数
- java - 将 JBoss 主页替换为应用程序主页
- docker - 使用 docker compose 和 mountebank 模拟外部调用
- flutter - Flutter 发布 HTTP 请求
- php - 虽然它是另一个项目 php 使用相同的会话登录
- node.js - JWT 不会过期 (Node.js)
- python-3.x - py2exe错误:[WinError 87]参数不正确
- xml - XML 错误消息开始和结束标记不匹配
- .net - 我是否缺少 dll 参考?IO.File.Move(ogPath, newPath, true) 有太多参数
- terraform - Terraform 状态迁移