Почему Django upvote увеличивает количество голосов только за последний добавленный элемент?

#django #python-3.x #django-models #django-forms #django-views

#django #python-3.x #django-модели #django-forms #django-просмотры

Вопрос:

В каждом элементе есть кнопка повышения, но когда я нажимаю на нее, это увеличивает количество голосов только за последний добавленный элемент.

 <a href="javascript:{document.getElementById('upvote').submit() }">
<button  class="btn btn-success d-block w-100 mt-4"><span class="pull-left">UPVOTE <i
    class="fa fa-thumbs-o-up"></i> </span> <span class="pull-right"> {{product.upvote}} </span>
</button>
</a>
<form action="{% url 'upvote' product.id %}" method="POST" id="upvote">
    {% csrf_token %}
    <input type="hidden" name="upvote">
</form>

from django.urls import path
from myApp import views
urlpatterns = [
    path('', views.HomePageView.as_view(),name='home'),
    path('<int:product_id>/upvote',views.Upvote,name='upvote'),
]

def Upvote(request, product_id):
    if request.method == 'POST':
        product = get_object_or_404(Product, pk=product_id)
        product.upvote  = 1
        product.save()
        return redirect('home')
  

Комментарии:

1. Потому что в HTML идентификаторы должны быть уникальными.

2. Как я могу сделать каждый элемент уникальным?

3. Не знаю, потому что вы не показали остальную часть шаблона, но, по-видимому, выполняется цикл for, чтобы вы могли добавить значение product.id or forloop.counter к upvote идентификатору в обоих местах.

4. Почему бы не привязать событие к классу, записать идентификатор элемента в любой атрибут данных и прочитать его оттуда?