django 获得帖子的所有点赞

问题描述 投票:0回答:1

我正在尝试获得主页模板中特定内容的所有喜欢,而且模板中还有很多产品。

这是我的观点.py

@login_required
def home(request):
    products = Product.objects.all()
    like_counts = {product.id: Like.objects.filter(product=product).count() for product in products}
    liked_products = Like.objects.filter(user=request.user, product__in=products).values_list('product', flat=True)
    context = {
        "products": products,
        "liked_products": liked_products,
        "like_counts": like_counts,
        "categories": Category.objects.all(),
    }    
    return render(request, 'shop/index.html', context)

@login_required
def likeProduct(request, product_id):
    product = get_object_or_404(Product, id=product_id)

    # Check if the user has already liked the product
    if not Like.objects.filter(user=request.user, product=product).exists():
        # Create a new Like object
        Like.objects.create(user=request.user, product=product)
        print('product liked')
        likes = Like.objects.all().count

        return JsonResponse({"status": "success","likes":f'{likes}'})
    else:
        liked = Like.objects.get(user=request.user)
        liked.delete()
        print('product like removed')
        likes = Like.objects.all().count
    return JsonResponse({"status": "success","likes":f'{likes}'})

def views_count(request,product_id):`
    item = Product.objects.get(id=product_id)
    item.views_count += 1
    item.save()

    return redirect('home')

这是我的index.html,我现在被困在这里,django 给出了各种奇怪的错误,并且不知道如何解决它:

{% csrf_token %}
<div class="d-flex justify-content-between">
   <button onclick="likeProduct({{ product.id }})" class="btn shadow-none bg-transparent rounded-pill"> <i class="{% if product.id in liked_products %}fas{% else %}far{% endif %} fa-heart"></i> {{ like_counts|default:"0"|get:product.id }}
   </button> 
   <button class="btn shadow-none bg-transparent rounded-pill"><i class="fas fa-star"></i></button> 
   <button class="btn btn-outline-primary"><i class="fas fa-comment"></i></button>
</div>
django django-templates django-filter
1个回答
0
投票

更改您的代码如下。

  1. 在views.py中
@login_required
def home(request):
    context = {
        "products": Product.objects.all(),
        "categories": Category.objects.all(),
    }    
    return render(request, 'shop/index.html', context)
  1. 在 models.py 中
class Product(models.Model):

# Youe other fields



# add these lines
#////////////////
    @property   
    def product_like_count(self):
        count = Like.objects.filter(product=self).count()
        return count
#//////////////

  1. 在模板中
{% for product in products %}


<!-- get id -->
{{ product.id }}


<!-- get like count of current product -->
{{ product.product_like_count }}
<!-- you can access all the fields of a product -->



{% for like in product.like_set.all %}


<!-- get id of like -->
{{ like.id }}
<!--you can access all the fields of a like -->


{% endfor %}




{% endfor %}

© www.soinside.com 2019 - 2024. All rights reserved.