如何将 POST 方法写入 Django 中的标签

A_K*_*A_K 6 django django-templates django-forms

我正在尝试编写一个 POST 方法一个“a”标签href,但它不起作用

我成功地将它写在另一个页面上以从一个选项中进行选择,但我试图在 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>
Run Code Online (Sandbox Code Playgroud)

这是我试图实现相同逻辑的 HTML,它完美地工作

                            {% csrf_token %}
                            <input class="btn btn-primary btn-md my-2 p" type="submit" value="Add to cart">

                            {% if object.variation_set.all %}

                            {% if object.variation_set.sizes %}
                        <select class="form-control" name="size">
                            {% for items in object.variation_set.sizes %}
                            <option value="{{ items.title|lower }}">{{ items.title|capfirst }}</option>
                            {% endfor %}                      
                        </select>
                        {% endif %}
                        {% endif %}
Run Code Online (Sandbox Code Playgroud)

这是意见:


@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
    )
    print(item)
    print(order_item_qs)
    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)
        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")
Run Code Online (Sandbox Code Playgroud)

这是使用 Post 方法的最佳方式吗?

Ali*_*ari 3

a追溯到网络实际上是一个通过超链接相互链接的页面的时代。POST 是一个 HTTP 概念,当涉及到 HTML 时,只能通过使用“表单提交”来实现。

当您使用 HTML 表单时,您使浏览器始终将请求发送到相同的 URL(即操作)。当浏览器打开包含表单的页面时,可以通过多种方式提交表单:

  1. 如果表单至少包含一个等于“submit”的input元素type,当用户单击提交按钮时,表单将被提交并将请求发送到服务器,
  2. 用户在表单内的现有输入元素中按 Enter 键,这将再次导致表单被提交。

method元素中的属性仅form影响提交表单时浏览器的工作方式。a元素不与其周围的表单交互,表单a内部的元素就像a表单外部的元素一样工作。您放入表单中的元素a只会导致浏览器导航到它,href而不管包含的表单或其method属性如何。

现在回答你的问题

这是使用 Post 方法的最佳方式吗?

使用 post 方法的正确方法是以下任何一种方法:

  1. 通过将 aform设置methodPOST并在其中包含一些包含数据或用户输入的输入元素,
  2. 通过执行 javascript,在您的情况下,可能会根据onclicka元素的操作来发出特定POST请求。您可以在这里找到规范指南。
  3. 或者如 WorkShoft 所说,在表单上设置 name 属性,并在单击链接时调用 document.[name].submit() 。