Как добавить «лайки» на главной странице для нескольких объектов с Django? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть кнопка Нравится / Не нравится 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()

views.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})

home.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. Не уверен, как это исправить. Ваша помощь очень ценится!

...