【问题标题】:Django Ajax form not being savedDjango Ajax 表单未保存
【发布时间】:2020-07-31 19:23:46
【问题描述】:

我想在 Django 中使用 Ajax 来处理提交后的结帐表单视图。表单提交后,我希望它转到:

return HttpResponseRedirect(reverse(str(next_page))+"?address_added=True"),即http://127.0.0.1:8000/checkout/?address_added=True

但由于某种原因,它不会去那里。而是要去http://127.0.0.1:8000/checkout/?csrfmiddlewaretoken=W4iXFaxwpdtbZLyVI0ov8Uw7KWOM8Ix5GcOQ4k3Ve65KPkJwPUKyBVcE1IjL3GHa&address=123+Main+Street&address2=&state=MA&country=USA&zipcode=55525&phone=%28877%29+314-0742&billing=on

因此,表单数据也没有得到保存。我在想是不是因为新版本的Django。

我想要做的是,在他们提交下订单按钮后,表单将变为无,即消失,然后我会在那里添加一个信用卡表单以进行付款。但它没有发生。这里有什么问题?我该怎么做?或者有更好的方法吗?

我的forms.py:

class UserAddressForm(forms.ModelForm):
    class Meta:
        model = UserAddress
        fields = ["address", "address", "address2", "state", "country", "zipcode", "phone", "billing"]

我的accounts.views.py:

def add_user_address(request):
    try:
        next_page = request.GET.get("next")
    except:
        next_page = None
    if request.method == "POST":
        form = UserAddressForm(request.POST)
        if form.is_valid():
            new_address = form.save(commit=False)
            new_address.user = request.user
            new_address.save()
            if next_page is not None:
                return HttpResponseRedirect(reverse(str(next_page))+"?address_added=True")
    else:
        raise Http404

我的orders.views.py:

@login_required()
def checkout(request):
    try:
        the_id = request.session['cart_id']
        cart = Cart.objects.get(id=the_id)
    except:
        the_id = None
        return redirect(reverse("myshop-home"))

    try:
        new_order = Order.objects.get(cart=cart)
    except Order.DoesNotExist:
        new_order = Order(cart=cart)
        new_order.cart = cart
        new_order.user = request.user
        new_order.order_id = id_generator()
        new_order.save()
    except:
        return redirect(reverse("cart"))


    try:
        address_added = request.GET.get("address_added")
    except:
        address_added = None 

    if address_added is None:
        address_form = UserAddressForm()
    else:
        address_form = None

    if new_order.status == "Finished":
        #cart.delete()
        del request.session['cart_id']
        del request.session['items_total']
        return redirect(reverse("cart"))


    context = {"address_form": address_form, "cart": cart}
    template = "orders/checkout.html"
    return render(request, template, context)

我的 urls.py:

path('ajax/add_user_address', accounts_views.add_user_address, name='ajax_add_user_address'),

我的 checkout.html:

<form method="POST" action="{% url 'ajax_add_user_address' %}?redirect=checkout">
    {% csrf_token %}
    <fieldset class="form-group">   
        {{ address_form|crispy }}
    </fieldset>
    <div class="form-group">
        <button class="btn btn-outline-dark" type="submit">Place Order</button>
    </div>
</form>

【问题讨论】:

  • 这个问题出现在同一作者关于相同或几乎相同主题的 11 个问题的序列中。其中许多是相互复制粘贴的副本,并且会浪费那些没有检查问题被重新提出多少次的有用读者的时间。

标签: django ajax ajaxform


【解决方案1】:

我个人会将它们分成两个视图,因为它们做不同的事情。

但是,如果您想保持这种状态,您可以执行以下操作:

首先,因为您正在发出 AJAX 请求,所以您应该返回一个 JsonResponse 对象。

在您看来,您可以渲染 checkout.html 并将其作为上下文变量传递给您的 json 响应:

def add_user_address(request):
   ...

   data = dict()
   context = {
       'address_form': form,
       ...
   }

   data['html_form'] = render_to_string("checkout.html",
                                        context,
                                        request=request)
   return JsonResponse(data)

在您的 $.ajax 成功函数中,您可以执行以下操作

success: function(data) {
  // console.log(data);
  $("div-to-replace-html").html(data.html_form);

}

【讨论】:

  • 它不起作用顺便说一句,它被分成两个视图(编辑)现在你能说我应该在哪里添加它们吗?
  • 有人帮忙吗?
  • 什么不起作用?你在哪里执行你的ajax请求?如果您只是发布表单,那么您并没有发出 ajax 请求。在你的视图中试试这个 add_user_address : print("Request is ajax: ", self.request.is_ajax())
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 2012-11-08
  • 2013-10-02
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多