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 %}
但我不知道如何获得所有喜欢的产品而不是收藏夹
我如何在模板中解决它?
我如何在模板中解决它?
难道不是在模板中解决这个问题。模板应该实现呈现逻辑,而不是业务逻辑。Django 的模板语言故意限制语法,以防止人们在模板中编写复杂的逻辑。
您可以注释QuerySet与Exists子查询[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给定的存在user,False则否则。
很可能user是request.user。
您可能希望使用[Django-doc]组合product和user唯一,以防止用户多次将相同的产品添加到: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模型部分。