首页 > 解决方案 > 如何使用 Django 在主页上为多个对象添加“喜欢”?

问题描述

我有一个适用于产品详细信息页面的 Ajax 喜欢/不喜欢按钮。但是,我想将它添加到列出多个产品的主页上。这是我目前在models.py中的内容:

class Product(models.Model):
    ...
    likes = models.ManyToManyField(User, blank=True, related_name='likes')
    ...

    def total_likes(self):
        return self.likes.count()


    def is_liked(self, request):
        return self.likes.filter(id=request.user.id).exists()

视图.py

def home(request):
    products = Product.objects.all().order_by('-pub_date')
    return render(request, 'product/home.html', {'product': products})


def detail(request, product_id):
    product = get_object_or_404(Product, product_id=product_id)
    is_liked = False
    if product.likes.filter(id=request.user.id).exists():
        is_liked = True
    context = {
        'product': product,
        'is_liked': is_liked,
        'total_likes': product.total_likes()
    }
    return render(request, 'product/detail.html', context)


def like_product(request):
    product = get_object_or_404(Product, id=request.POST.get('id'))
    if product.likes.filter(id=request.user.id).exists():
        product.likes.remove(request.user)
        is_liked = False
    else:
        product.likes.add(request.user)
        is_liked = True
    context = {
        'product': product,
        'is_liked': is_liked,
        'total_likes': product.total_likes()
    }
    if request.is_ajax():
        html = render_to_string('product/likes.html', context, request=request)
        return JsonResponse({'form': html})

主页.html

<div class="album py-5 bg-dark">
  <div class="container">
    <div class="row">
      {% for product in product.all %}
      {% if product.featured %}
        ...
        <div id="like-section-{{ product.id }}">{{ product.total_likes }} Like{{ product.total_likes|pluralize }}
          <form action="{% url 'like_product' %}" method="post">{% csrf_token %}
            {% if product.is_liked %}
              <button type="submit" name="product_id" value="{{ product.id }}" class="btn btn-like btn-danger">Dislike</button>
            {% else %}
              <button type="submit" name="product_id" value="{{ product.id }}" class="btn btn-like btn-primary">Like</button>
            {% endif %}
          </form>
        </div>
        ...
      {% endif %}
      {% endfor %}
    </div>
  </div>
</div>

目前,喜欢/不喜欢按钮的状态没有被保存(当我按下“喜欢”时,按钮变为“不喜欢”,并且正在记录类似的内容。但是在我重新加载页面后,按钮变为“喜欢”)。似乎类is_liked内的函数存在问题Product。不知道如何解决。非常感谢您的帮助!

标签: pythondjangodjango-views

解决方案


推荐阅读