Как расширить профиль пользователя для сохранения данных в Django

Я новичок в Django и пытаюсь создать сайт, на котором пользователь может просматривать БД книг и связанных с ними авторов и добавлять любую книгу в «избранное». Я много искал и не могу найти удовлетворительного способа сделать это - или вообще сохранить какие-либо данные пользователя, кроме настраиваемых полей при создании пользователя.

Моя текущая идея заключается в расширении UserModel для добавления дополнительного поля, которое связывает с пользователем его любимую книгу. Советы по UserModel можно найти здесь

Теперь я могу увидеть профиль пользователя с некоторыми избранными книгами, войдя в учетную запись администратора, но я не могу связать класс/функцию View с моим bookfavs.html, чтобы пользователь мог увидеть свои избранные книги. В bookfavs.html указывается имя пользователя, но не избранное.

readable_project app_name = bookshelf

#Models.py
class UserProfile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    favorites = models.ManyToManyField(Book, related_name='favourites')

class Author(models.Model):
    first_name=models.CharField(max_length=30)
    last_name=models.CharField(max_length=30)
    dob = models.DateField()
    bio = models.CharField(max_length=300)
    
    def __str__(self):
        return self.first_name + " " + self.last_name

    def get_absolute_url(self):
            return reverse('authorlist')

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    users = models.ManyToManyField(User)
    title = models.CharField(max_length=50)
    num_page = models.IntegerField()
    date_pub = models.DateField()
    tags = models.CharField(max_length=200)
    blurb = models.CharField(max_length=300)

    def get_absolute_url(self):
            return reverse('')`


#views.py
#Add favourite button...?
def favorite(request, pk):
    if request.method == 'POST':
        favorite = Book.objects.get(pk=pk)
        user = request.user
        user.favorites.add(favorite)
        messages.add_message(request, messages.INFO, 'Book Favorited.')
        return redirect('home')


#List ALL books
class BookList(ListView):
    model = Book
    template_name='bookshelf/booklist.html'

#List favourite books
class BookFavs(TemplateView):
    model = UserProfile
    template_name = 'bookshelf/bookfavs.html'
    def get_context_data(self,*args, **kwargs):
        context = super(BookFavs, self).get_context_data(*args,**kwargs)
        context['users'] = UserProfile.objects.all()
        return context

#bookfavs.html
{% if user.username %} 
<h4 class="header-greet">Welcome {{ user.username }} to your books!</h4> 
{% endif %}

{% if user.is_authenticated %}
    {% with userprofile.favorites.all as favourite_books %}
      {% for book in book_list %}
        {% if book in favorite_book %}
        <p>{{ book.title }}</p>
        {% endif %}
      {% endfor %}
    {% endwith %}
{% endif %}

Проблемы :

  1. вы пытаетесь получить доступ к userprofile.favorites.all в шаблоне, но передаете users (который является списком всех профилей пользователя) в контекст шаблона.
  2. в вашем шаблоне вы выполняете цикл через book_list, но это должно быть favourite_books (любимые книги пользователя), чтобы проверить, есть ли книга в его избранном.

Код :

# List favorite books
class BookFavs(TemplateView):
    template_name = 'bookshelf/bookfavs.html'

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)

        # access the current user's profile and their favorite books

        if self.request.user.is_authenticated:
            user_profile = self.request.user.userprofile
            context['favorite_books'] = user_profile.favorites.all()
        return context

Вы можете изменить ваш bookfavs.html в соответствии с новым контекстом с некоторыми дополнительными сообщениями:

{% if user.is_authenticated %}
  <h4>Welcome {{ user.username }}! Here are your favorited books:</h4>

  <ul>
    {% for book in favorite_books %}
      <li>{{ book.title }}</li>
    {% empty %}
      <p>You have no favorite books yet.</p>
    {% endfor %}
  </ul>
{% else %}
  <p>Please log in to view your favorite books.</p>
{% endif %}
Вернуться на верх