Django:如何返回上一个URL

时间:2016-03-09 14:55:17

标签: django django-templates django-views

新手在这里学习使用Flask开发使用python的web应用程序。现在我正在尝试通过使用django重做相同的应用程序来学习django 1.9。 现在,我一直试图获取当前URL并将其作为参数传递,以便用户可以在下一页上的操作完成后返回。

在Flask中,要返回上一个URL,我会使用'next'参数和request.url在更改页面之前获取当前url。

在模板中你会发现类似的东西:

<a href="{{ url_for('.add_punchcard', id=user.id, next=request.url) }}">Buy punchcard :</a>

并在视图中:

redirect(request.args.get("next"))

我认为这与django差不多,但我不能让它发挥作用。我确实找到了一些建议,但它们适用于较旧的django版本(早于1.5版)并且不再工作了(并且随着解决方案的推移,它们会非常震撼!)

现在,我认为我正在使用

return redirect(next)

注意:在django中使用return redirect似乎是最新的,如果我通过网络上的解决方案判断总是似乎使用返回HttpResponse(...,所以我最近在如何做事情中采取了很多变化

在模板中我有

<a href="{% url 'main:buy_punchcard' member.id next={{ request.path }} %}">Buy punchcard</p>

但实际上会返回错误

  

无法解析余数:'{{'来自'{{'

我确实在settings.py

中添加了context_processors
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
)

但这只是长时间错误中的最后一个错误。最重要的是,我无法使其发挥作用。

因此,任何人都可以指出我在django 1.9中如何做到这一点的正确方向?它看起来像一个非常基本的功能,所以我认为它会更容易。

2 个答案:

答案 0 :(得分:4)

如果您希望next包含在查询字符串中,请将其移至url标记之外:

<a href="{% url 'main:buy_punchcard' member.id %}?next={{ request.path }}">Buy punchcard</p>

在您看来,您可以从next抓取request.GET,并使用HttpResponseRedirectredirect快捷方式返回重定向回复。

from django.utils.http import is_safe_url

next = request.GET.get('next', '/default/url/')
# check that next is safe
if not is_safe_url(next):
    next = '/default/url/'
return redirect(next)

请注意重定向到从查询字符串获取的网址可能不安全。例如,它可以链接到不同的域。 Django有一个方法is_safe_url,用于在登录或注销时检查下一个URL。

答案 1 :(得分:0)

您不需要{{ }},只需:

<a href="{% url 'main:buy_punchcard' member.id next=request.path %}">Buy punchcard</p>