首页 > 解决方案 > Django模型ID没有通过for循环改变

问题描述

所以我的 Django 模板中有一个 for 循环,它遍历我的产品模型中的产品。产品模型有一个amount属性,当用户单击“添加”按钮时该属性会发生变化。我制作了一个隐藏表单来启动 upvote 方法,该方法接受一个请求和 apk并将金额属性增加 1。

问题是当我点击添加按钮时,只有两个产品的数量增加了。我无法让其余产品的数量属性增加。


这是 Django 模板代码:

<div class="card-deck d-flex justify-content-start container-fluid">
{% for product in products %}
    <div class="card lead m-3" style="min-width: 18rem;">
      <div class="card-body">
        <h5 class="card-title">{{ product.name }}</h5>
        <h6 class="card-subtitle mb-2 text-muted">{{ product.product_id }}</h6>
          <hr>
        <p class="card-text">
            Expiration date: {{ product.expiration_date }}
        </p>
        <p class="card-text">
            amount: {{ product.amount }} <a href="javascript:{document.getElementById('upvote').submit();}"><button class="btn btn-primary btn-sm">+</button></a>
        </p>

        <p class="card-text">
            tags:
        {% for t in product.tag.all %}
            <span class="badge badge-primary">{{ t.name }}</span>
        {% endfor %}
        </p>
      </div>
    </div>
    <form action="{% url 'upvote' pid=product.id %}" method="POST" id="upvote">
    {% csrf_token %}
        <input type="hidden">
    </form>

这是views.py文件中的upvote方法:

def upvote(request, pid):
if request.method == "POST":
    product = get_object_or_404(models.Product, pk=pid)
    product.amount += 1
    product.save()
return redirect('home')

标签: pythondjango

解决方案


您最终会拥有多个具有相同id( upvote) 的元素,这是不允许的,并且 Javascript 代码始终使用form它找到的第一个元素并提交该元素。

要拥有唯一的表单 ID,请更改以下行

<form action="{% url 'upvote' pid=product.id %}" method="POST" id="upvote">

<form action="{% url 'upvote' pid=product.id %}" method="POST" id="upvote_{{ product.id }}">

和以下行

<a href="javascript:{document.getElementById('upvote').submit();}">

<a href="javascript:{document.getElementById('upvote_{{ product.id }}').submit();}">

推荐阅读