#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-адрес