Django反向'str'对象没有属性'get'

时间:2019-06-28 13:38:41

标签: django django-views

我正在尝试在django视图中使用反向方法,但出现了异常'str'对象,没有属性'get'。

这是我的观点

class AbandonTicketView(View):
    context = dict()
    template_name = "places/order_detail.html"

    def get(self, request, uidb64, token, ordercode):
        order = abandon_oder(uidb64, token, ordercode)
        if order is not None and order.paid is False:
            return reverse("order_detail", kwargs={"ordercode": order.code})
        return redirect("tickets")

我要去的视图:

class OrderDetailView(LoginRequiredMixin, View):
    template_name = "places/order_detail.html"
    context = dict()

    def get(self, request, ordercode):
        order = Order.objects.get(code=ordercode)
        self.context["order"] = order
        self.context["key"] = settings.tycoon.STRIPE_PUBLISHABLE_KEY

        if order.send_count >= 3 and order.paid is False:
            self.context["abandon_ticket"] = "Order was canceled"
        return render(request, template_name=self.template_name, context=self.context)

    def post(self, request, ordercode):
        order = pay_for_ticket(ordercode, request.POST["stripeToken"], request.user)
        self.context["order"] = order
        return render(request, template_name=self.template_name, context=self.context)

这是网址:

 path("orders/<code:ordercode>/detail/", views.OrderDetailView.as_view(), name="order_detail"),
 path("tickets/", views.OrderedTicketsView.as_view(), name="tickets"),

我真的不知道为什么会这样,因为我之前做过类似的反向操作,并且一切正常,但现在不行。您能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

reverse()返回一个字符串,但是您的视图必须返回一个HttpResponse

更改您的行:

return reverse("order_detail", kwargs={"ordercode": order.code})

也使用redirect()(就像视图的另一部分一样)

return redirect("order_detail", args=[order.code, ])

或者也许像这样简化

return redirect("order_detail", order.code)

行得通吗?

答案 1 :(得分:0)

您可以将 redirect 与 reverse 结合使用,它可以工作。

from django.shortcuts import redirect

return redirect(reverse("order_detail", kwargs={"ordercode": order.code}))

OR 做同样事情的第二个关键字是:

from django.http import HttpResponseRedirect
return HttpResponseRedirect(reverse("order_detail", kwargs={"ordercode": order.code}))

这背后的原因是 reverse 仅以字符串的形式返回 URL。当您想重定向 HTTP 响应时应该发生。只有在只需要反向 URL 的情况下才应使用,否则您还需要生成 HTTP 响应。