Песня Джанго не добавляется в «любимые песни»

#django

Вопрос:

Я хочу, чтобы мои пользователи могли добавлять определенные песни Favourite Songs , но, хотя success message 'Added to favourite songs' «но», когда я посещаю Favourite Songs страницу, я не вижу там песен. Как я могу это исправить? Заранее спасибо!

Мой models.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})
 

Мой views.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 %}
 

Комментарии:

1. Как вы сохраняете в БД, какие пользователи добавили это в качестве любимых песен?

2. на самом деле я об этом не думал :’)

Ответ №1:

Ваш Song не подключен к User сети , поэтому вы никогда не отслеживаете, какая песня пользователя является любимой.

Вы должны добавить a 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].

Комментарии:

1. братан, я изменил свой код, и теперь, когда я нажимаю на Add to Favourite Songs кнопку, в терминале Method Not Allowed (GET): /add-to-fav-songs/1/ написано, а в chrome написано This page isn’t working . Затем, когда я перехожу на Favourite Songs страницу, ошибка name 'request' is not defined в Fav_songs представлении на основе классов

2. @Abrar: вы должны сделать небольшой <form method="post" action="{% url 'name-of-view' song.id %}"><input type="submit"></form> , чтобы отправлять запросы на просмотр.

3. это не меняет ошибок 🙁

4. @Abrar: пожалуйста, отредактируйте вопрос и поделитесь шаблоном, в котором вы написали элементы, чтобы добавить их в избранное. Вы должны работать не с <a href="..."> мини-формой , а с мини-формой, которая делает запрос на публикацию.

5. в нем действительно нет шаблона, в котором песни можно добавлять в избранные. Это просто кнопка/форма представления и URL-адрес