我正在尝试在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"),
我真的不知道为什么会这样,因为我之前做过类似的反向操作,并且一切正常,但现在不行。您能帮我解决这个问题吗?
答案 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 响应。