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