Liking песни в моей музыки веб-сайт не работает Django приложение
Я создаю сайт музыкальных потоков с помощью Django и испытываю трудности с удалением песни из списка понравившихся песен (добавление работает). У меня есть {% for % }, в котором циклически отображаются все песни, и когда я нажимаю на кнопку, песня должна быть удалена. Я также хочу, чтобы на каждой странице понравившиеся песни были выделены красным цветом. Как я могу это исправить?
models.py (для песен и песен, которые нравятся):
class Song(models.Model):
song_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
artist = models.CharField(max_length=50)
album = models.CharField(max_length=50, blank=True)
genre = models.CharField(max_length=20, blank=True, default='genre')
song = models.FileField(upload_to="songs/", validators=[FileExtensionValidator(allowed_extensions=['mp3', 'wav'])], default="name")
image = models.ImageField(upload_to="songimage/", validators=[FileExtensionValidator(allowed_extensions=['jpeg', 'jpg', 'png'])])
data = models.DateTimeField(auto_now=False, auto_now_add=True)
slug = models.SlugField()
liked_by_users = models.ManyToManyField(User, related_name="liked_songs")
views.py (чтобы понравилась песня):
def likesong(request):
user = request.user
if user.is_authenticated:
if request.method == "POST":
song_id = request.POST.get('song_id')
state = request.POST.get('state')
song = Song.objects.get(song_id=song_id)
if state == 'liked':
if song.liked_by_users.filter(id=user.id).exists():
song.liked_by_users.remove(user)
else:
user.liked_songs.add(song)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
HTML:
{% for i in all_liked %}
<div class="sameMovieCard">
<div class="container_songpost">
<img src="{{i.image.url}}" id="A_{{i.song_id}}"/>
<div class="overlay_songpost"></div>
<div class="play-btn_songpost">
<a class="play-btn" data-song-url="{{i.song.url}}" id="{{i.song_id}}" onclick="playSong(this)"><i class="fa-solid fa-circle-play"></i></a>
</div>
</div>
<div class="songpost_data">
<h5 class="song-name" id="B_{{i.song_id}}"><a data-song-url="{{i.song.url}}" id="{{i.song_id}}" onclick="playSong(this)">{{i.name}}</a></h5>
<p class="singer-name" id="C_{{i.song_id}}">{{i.artist}}</p>
<form id="delform" action="{% url 'music:delete_song_from_liked' %}" method="post">
{% csrf_token %}
<input type="hidden" name="song_id" value="{{ i.song_id }}">
<input type="hidden" id="state" name="state" value="{{ state }}">
<button type="submit" id="submitremove" style="color: red; margin-top: 15px;">
<i style="margin-left: 200px" class="fa-solid fa-ban fa-2x"></i>
</button>
</form>
</div>
</div>
{% endfor %}
Вы не можете использовать .songs
на favorites
, так как это не LikedSong
объект, а QuerySet
из LikedSong
элементов.
Мы можем упростить запросы до:
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
@require_POST
@login_required
def likesong(request):
song_id = request.POST.get('song_id')
state = request.POST.get('state')
if state == 'liked':
LikedSong.objects.filter(music_id_id=song_id, user=request.user).delete()
else:
LikedSong.objects.get_or_create(music_id_id=song_id, user=request.user)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
Примечание: Обычно не добавляют суффикс
…_id
к полюForeignKey
, так как Django автоматически добавит поле-"близнец" с суффиксом…_id
. Поэтому он должен бытьmusic
, вместо.music_id
Note: You can limit views to a view to authenticated users with the
@login_required
decorator [Django-doc].
Note: You can limit views to POST requests with the
@require_POST
decorator [Django-doc].