【问题标题】:How to add or remove items with variations in an Order Summary page?如何在订单摘要页面中添加或删除具有变体的项目?
【发布时间】:2020-06-29 15:25:24
【问题描述】:

我已经为具有变体 s、m 和 l 的项目创建了一个模型,当我从产品详细信息页面添加具有不同变体的相同项目(例如 item1 尺寸小和 item1 尺寸中等)时,它会正确添加数量使用产品详细信息页面中的 post 方法为每个具有不同变体到订单摘要页面的项目。

现在在“订单摘要”页面中,当我尝试添加或删除具有变体的商品时,它只会更新到添加的第一个商品,因为它反映的是 item.slug 而不是商品变体。

要重新澄清添加具有不同变体的相同项目工作正常,除了在模板订单 summary.html 中有一个带有 href 的标签添加到购物车并从购物车中删除单个项目,我认为这是问题的原因不将数量更新到变体而是更新到 item.slug,添加到购物车不是读取变体。我在视图和模板中绘制了我认为错误原因的箭头。

我也尝试在 order.summary.html 模板中添加 post 方法,但没有成功。 (我这样做的原因是我通过 post 方法从产品详细信息模板中添加了项目变体,我也尝试过这样做,如下图所示)

为了更好地澄清这里是models.py

class Item(models.Model):
    designer = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("core:product", kwargs={'slug': self.slug})

    def get_add_to_cart_url(self):
        return reverse("core:add-to-cart", kwargs={'slug': self.slug})

    def get_remove_from_cart_url(self):
        return reverse("core:remove-from-cart", kwargs={'slug': self.slug})

class VariationManager(models.Manager):
    def all(self):
        return super(VariationManager, self).filter(active=True)

    def sizes(self):
        return self.all().filter(category='size')

VAR_CATEGORIES = (('size', 'size',),)

class Variation(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    category = models.CharField(
        max_length=120, choices=VAR_CATEGORIES, default='size')
    title = models.CharField(max_length=120)
    objects = VariationManager()

    def __str__(self):
        return self.title

class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    variation = models.ManyToManyField(Variation)

    def __str__(self):
        return f"{self.quantity} of {self.item.title}"

这里是views.py

class OrderSummaryView(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):

        try:
            order = Order.objects.get(user=self.request.user, ordered=False)
            context = {
                'object': order
            }
            return render(self.request, 'order_summary.html', context)
        except ObjectDoesNotExist:
            messages.warning(self.request, "You do not have an active order")
            return redirect("/")

@login_required
def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    order_item_qs = OrderItem.objects.filter(
        item=item,
        user=request.user,
        ordered=False
    )
    item_var = []  # item variation
    if request.method == 'POST':
        for items in request.POST:
            key = items
            val = request.POST[key]
            try:
                v = Variation.objects.get(
                    item=item,
                    category__iexact=key,
                    title__iexact=val
                )
                item_var.append(v)
            except:
                pass

        if len(item_var) > 0:
            for items in item_var:
                order_item_qs = order_item_qs.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)  <------------- this line is not read in the template
        order_item.save()

    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        # check if the order item is in the order
        if not order.items.filter(item__id=order_item.id).exists():
            order.items.add(order_item)
            messages.info(request, "This item quantity was updated.")
            return redirect("core:order-summary")
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(
            user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
        messages.info(request, "This item was added to cart.")
        return redirect("core:order-summary")


@login_required
def remove_single_item_from_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    order_qs = Order.objects.filter(
        user=request.user,
        ordered=False
    )
    if order_qs.exists():
        order = order_qs[0]
        # check if the order item is in the order
        if order.items.filter(item__slug=item.slug).exists():
            order_item = OrderItem.objects.filter(
                item=item,
                user=request.user,
                ordered=False
            )[0]
            if order_item.quantity > 1:
                order_item.quantity -= 1
                order_item.save()
            else:
                order.items.remove(order_item)
            messages.info(request, "This item quantity was updated")
            return redirect("core:order-summary")
        else:
            messages.info(request, "This item was not in your cart")
            return redirect("core:product", slug=slug)
    else:
        messages.info(request, "You do not have an active order")
        return redirect("core:product", slug=slug)

这是导致问题的模板:

{% extends "base.html"%}
{% block content %}
        <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>              <------------------------------issue is with this line
                {{ order_item.quantity }}
                <a href="{% url 'core:add-to-cart' order_item.item.slug %}"><i class="fas fa-plus ml-2"></a></i>                                     <------------------------------issue is with this line
                </td>                
                <td>
                {% if order_item.variation.all %}
                {% for variation in order_item.variation.all %}
                {{ variation.title|capfirst }}
                {% endfor %}
                {% endif %}
                </td> 
            </tr>
            </tbody>
        </table>
        </div>
        </div>
{% endblock content %}

我尝试在模板中写一个 post 方法而不是 a href 但它不起作用,这是我尝试过的

<form method="POST" action="{{ item.get_add_to_cart_url }}">
{% csrf_token %}
<a href="{% url 'core:add-to-cart' order_item.item.slug %}"><i class="fas fa-plus ml-2"></a></i>
</form>

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    我认为你的表单操作action="{{ item.get_add_to_cart_url }}"

    &lt;form method="POST" action="."&gt;(如果您的操作是当前页面)否则 像这样写 &lt;form method="POST" action="{% URL 'YOUR URL NAME ' PARAMS %}"&gt;

    我也是初学者,我看到很多例子。我希望这些东西有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 2019-09-26
      • 1970-01-01
      • 2023-03-06
      • 2014-07-09
      • 2014-05-05
      • 2019-04-23
      • 2012-09-18
      相关资源
      最近更新 更多