姜戈。如何找出用户喜欢或不喜欢帖子?

Hah*_*n't 1 python django django-templates django-models

我有2个模型。产品和收藏夹(类似的)
收藏夹与产品和用户有关。我需要检查模板是否用户与产品有关系以插入喜欢或不喜欢的按钮。

class Favorite(models.Model):
    """User favorite products"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='favorites')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='favorites')


class Product(models.Model):
    """Store product"""
    ...

Run Code Online (Sandbox Code Playgroud)

在模板中我有:
{% for product in products %} ...

我想我可以这样做 {% if product in user.favorites.all %}
但我不知道如何获得所有喜欢的产品而不是收藏夹

我如何在模板中解决它?

Wil*_*sem 5

我如何在模板中解决它?

难道不是在模板中解决这个问题。模板应该实现呈现逻辑,而不是业务逻辑。Django 的模板语言故意限制语法,以防止人们在模板中编写复杂的逻辑。

您可以注释QuerySetExists子查询[Django的DOC]来检查用户:

from django.db.models import Exists, OuterRef

Product.objects.annotate(
    is_favorite=Exists(
        Favorite.objects.filter(user=user, product_id=OuterRef('pk'))
    )
)
Run Code Online (Sandbox Code Playgroud)

Product从此查询集中产生的s 将具有一个额外的属性.is_favorite,即True如果Favorite给定的存在userFalse则否则。

很可能userrequest.user

您可能希望使用[Django-doc]组合productuser唯一,以防止用户多次将相同的产品添加到:UniqueConstraintFavorite

from django.conf import settings

class Favorite(models.Model):
    """User favorite products"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='favorites'
    )
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name='favorites'
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'product'], name='favorite_once')
        ]
Run Code Online (Sandbox Code Playgroud)

注意:通常最好使用settings.AUTH_USER_MODEL[Django-doc]来引用用户模型,而不是直接使用User模型 [Django-doc]。有关更多信息,您可以查看文档参考User模型部分