【问题标题】:Django redirect doesn't work in class based viewDjango 重定向在基于类的视图中不起作用
【发布时间】:2020-06-07 16:32:34
【问题描述】:

我有一个基于类的视图,我正在检查一些条件并重定向到另一个页面,我在终端中看到对该页面的 GET 请求,它返回 200,但它没有重定向到该页面:

class CheckoutFinalView(CartOrderMixin, View):
def post(self, request, *args, **kwargs):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    order_obj = None
    if cart_obj.items.count() == 0:
        return redirect("carts:cart")
    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
    has_card = False
    if billing_profile is not None:
        order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj)
        order_obj.save()
        has_card = billing_profile.has_card
    is_prepared = order_obj.check_done()
    user = User.objects.get(id=request.user.id)
    if is_prepared:
        print(is_prepared)
        did_charge, crg_msg = billing_profile.charge(order_obj)
        print(did_charge)
        if did_charge:
            order_obj.mark_paid()  # sort a signal for us
            request.session['cart_items'] = 0
            del request.session['cart_id']
            del request.session["order_id"]
            if not billing_profile.user:
                print("not billing profile user: ", billing_profile.user)
                billing_profile.set_cards_inactive()
            return redirect("checkout_final")
        else:
            print(crg_msg)
            return redirect("checkout_final")

def get(self, request, *args, **kwargs):
    return redirect("carts:success")

我也试过 return HttpResponseRedirect(reverse('carts:success')) 。但它也不起作用。

【问题讨论】:

  • 你这里只重定向一个 POST 请求。

标签: python django python-3.x django-views


【解决方案1】:

我在终端中看到对该页面的 GET 请求,它返回 200。

这很正常,您只指定为 POST 请求重定向,因为您覆盖了def post

因此,您应该为 GET 请求实现它:

class CheckoutFinalView(CartOrderMixin, View):

    def get(self, request, *args, **kwargs):
        return redirect('carts:success')

    def post(self, request, *args, **kwargs):
       return redirect('carts:success')

请注意,这个视图并没有太多,它只是重定向。在这种情况下,您可以使用RedirectView

from django.views.generic import RedirectView
from django.urls import reverse_lazy

class CheckoutFinalView(RedirectView):
    url = reverse_lazy('carts:success')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2013-04-06
    • 2019-09-24
    • 2020-01-22
    • 2017-05-03
    • 1970-01-01
    • 2020-10-11
    • 2012-10-23
    相关资源
    最近更新 更多