Как отправить ошибку пользователю, который уже добавил книгу в избранное - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь заставить пользователя перестать добавлять книги в избранное, когда они уже добавлены, и показать сообщение в шаблоне. Вот мой класс django python:

class User(models.Model):
    fname = models.CharField(max_length=255)
    lname = models.CharField(max_length=255)
    email = models.EmailField()
    password = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = UserManager()


class Book(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField()
    uploaded_by = models.ForeignKey(User,
                                    related_name="book_uploaded", on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = BookManager()


class Like(models.Model):
    u_like = models.ForeignKey(
        User, related_name="user_like", on_delete=models.CASCADE)
    b_like = models.ForeignKey(
        Book, related_name="book_like", on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

А вот мой views.py:

def book_info(request, id):

    user_who_like = Book.objects.get(id=id).book_like.all()

    context = {
        'book': Book.objects.get(id=id),
        'user': User.objects.get(id=request.session["user_id"]),
        'user_who_like': Book.objects.get(id=id).book_like.all(),
        'user_uploaded': Book.objects.first().uploaded_by,
    }
    return render(request, 'book_info.html', context)

def like(request, id):
    book = Book.objects.get(id=id)
    user = User.objects.get(id=request.session["user_id"])
    like = Like.objects.create(u_like=user, b_like=book)

    return redirect(f"/books/{book.id}")

Ценю всю вашу помощь! Спасибо

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

это мой def:

def like(request, id):
    book = Book.objects.get(id=id)
    user = User.objects.get(id=request.session["user_id"])
    like = Like.objects.get_or_create(u_like=user, b_like=book)
    if not like[1]:
        messages.error(request,"Already added to favorite",extra_tags="like_error") 
        return redirect("/books/")
    context = {
        'like1': like[1],
    }

    return redirect(f"/books/{book.id}")

и вот мой шаблон:

<form action="/books/{{book.id}}/like/" method="post" class="like">
    {% csrf_token %}
    <button type="submit" class="btn far fa-thumbs-up"></button>

    {% if messages %}
    <ul class="messages">
        {% for message in messages %}
        {% if "like_error" in message.tags %}
        <li class="text-danger">{{ message }}</li>
        {%endif%}
        {% endfor %}
    </ul>
    {%endif%}

</form>
0 голосов
/ 28 апреля 2020

Вы можете попробовать это:

def like(request, id):
    book = Book.objects.get(id=id)
    user = User.objects.get(id=request.session["user_id"])
    like = Like.objects.get_or_create(u_like=user, b_like=book)

    if not like[1]:
        message = "Already added to favourite"

    return redirect(f"/books/{book.id}")

Здесь, что get_or_create делает, это создает объект, если объект еще не присутствует, и возвращает кортеж, сам объект и логическое значение. Если объект создан недавно, он вернет True, иначе False. Затем вы можете отправить это сообщение на свой шаблон обычным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...