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].

Вернуться на верх