为了账号安全,请及时绑定邮箱和手机立即绑定

产品变体未反映 Django 电子商务项目中订单摘要中的更新数量

产品变体未反映 Django 电子商务项目中订单摘要中的更新数量

慕勒3428872 2023-04-18 17:20:42
我对订单摘要页面中的变体和与之相关的数量有疑问。当我将 2 件商品添加到购物车时:小号商品 X 数量:1中号商品 X 数量:1当我更改商品 X 尺寸中号的数量时,此更改反映在首先选择的商品 X 尺寸小号中。要像这样:小号商品 X 数量:2中号商品 X 数量:1在订单汇总中,模板中有加号和减号可以更改数量。我最近明白了,因为模板中没有表格。将带有表单数据的 POST 请求发送到添加到购物车视图的代码不存在,因为 item_var 将始终是一个空列表,因此 order_item.variation.add(*item_var) 什么都不做。我不知道如何向该模板添加 POST 请求。在模板中有一个添加到购物车的 URL”,但 URL 是通过 GET 传输的,因此 if request.method == 'POST': 之后的代码永远不会命中。此外,即使它会命中,add_to_cart url 也知道与变化无关,因为它只会获得物品弹头。这是模板:    <main>        <div class="container">        <div class="table-responsive text-nowrap" style="margin-top:90px">        <h2> Order Summary</h2>        <table class="table">            <thead>            <tr>                <th scope="col">#</th>                <th scope="col">Item Title</th>                <th scope="col">Price</th>                <th scope="col">Quantity</th>                <th scope="col">Size</th>                 <th scope="col">Total Item Price</th>            </tr>            </thead>            <tbody>            {% for order_item in object.items.all %}            <tr>                <th scope="row">{{ forloop.counter }}</th>                <td>{{ order_item.item.title }}</td>                <td>{{ order_item.item.price }}</td>                <td>                <a href="{% url 'core:remove-single-item-from-cart' order_item.item.slug %}"><i class="fas fa-minus mr-2"></a></i>                {{ order_item.quantity }}                <a href="{% url 'core:add-to-cart' order_item.item.slug %}"><i class="fas fa-plus ml-2"></a></i>                </td>                                <td>                {% if order_item.variation.all %}                {% for variation in order_item.variation.all %}                {{ variation.title|capfirst }}                {% endfor %}                {% endif %}                </td> 
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

当然,对于 django 来说,这两个项目是相同的。

负责此的行是:

if order_item_qs.exists():
    order_item = order_item_qs.first()  # Here, you are always picking the first item that your filter returned, see: https://docs.djangoproject.com/en/dev/ref/models/querysets/#first
    order_item.quantity += 1
    order_item.save()

第一的()¶

返回查询集匹配的第一个对象,如果没有匹配的对象则返回 None 。如果 QuerySet 没有定义排序,则查询集自动按主键排序。这会影响聚合结果,如与默认排序或 order_by() 的交互中所述。

然而,罪魁祸首是:

order_item_qs = OrderItem.objects.filter(
    item=item,
    user=request.user,
    ordered=False)

你想将变化传递给它,例如

order_item_qs = OrderItem.objects.filter(
    item=item,
    user=request.user,
    ordered=False,
    variation=variation
)

您可以考虑将尺码添加为产品字段,并根据变体创建单独的产品。但是,简单地检索变体并确保仅通过将其传递给 filter() 来增加正确的项目也是一种正确的方法。


查看完整回答
反对 回复 2023-04-18
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

order_item_qs = order_item_qs.filter(

            Q(item_variations__exact=v)

        )


with:

order_item_qs = order_item_qs.filter(item_variations__variation=v)


查看完整回答
反对 回复 2023-04-18
?
智慧大石

TA贡献1946条经验 获得超3个赞

我认为问题在块


if order_item_qs.exists():

        order_item = order_item_qs.first()

        order_item.quantity += 1

        order_item.save()

此代码块仅在您需要将其重写为


if len(item_var) > 0:

   for items in item_var:

      order_item_qs = OrderItem.objects.filter(

        item=item,

        user=request.user,

        ordered=False

    ).filter(variation__exact=items,)


      if order_item_qs.exists():

          order_item = order_item_qs.first()

          order_item.quantity += 1

          order_item.save()

      else:

          order_item = OrderItem.objects.create(

             item=item,

            user=request.user,

            ordered=False

        )

          order_item.variation.add(*item_var)

          order_item.save()

    ```


查看完整回答
反对 回复 2023-04-18
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信