Django:如何返回上一个URL

3

我是一名新手,学习使用 Flask 用 Python 开发 Web 应用程序。现在我正在尝试使用 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似乎是最近出现的,如果我从网上找到的解决方案总是使用return HttpResponse(...,那么最近怎么做事情发生了很多变化。
在模板中我有:
<a href="{% url 'main:buy_punchcard' member.id next={{ request.path }} %}">Buy punchcard</p>

但实际上这会返回一个错误

无法解析剩余部分: '{{' from '{{'

我已经在 settings.py 中添加了 context_processors。

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
)

但这只是一连串错误中的最后一个。总之,我无法使其工作。

因此,有人可以指引我在Django 1.9中如何实现这个功能吗?看起来这是一个相当基础的函数,所以我认为它应该会更容易些。


1
如果你提供了你尝试过但没有成功的解决方案链接,或许会有所帮助。我无法想象为什么 Django 1.5 的解决方案今天不起作用。请注意,redirect在很多年前的 Django 1.1 中就已经被添加了。如果你喜欢,可以继续使用 HttpResponseRedirect,并且轻松地转换为使用 redirect - Alasdair
2个回答

4
如果你想把“next”包含在查询字符串中,那么请将其移出“url”标签之外:

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

根据您的看法,您可以从request.GET中获取next,然后使用HttpResponseRedirect或者redirect快捷方式返回重定向响应。

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)

请注意从查询字符串获取的url可能不安全,因为它可能链接到不同的域名。Django有一个方法is_safe_url,用于在登录或注销时检查下一个url。


2
谢谢,这正是我所寻找的额外信息。它完美地运行,我现在有了正确的方法在django中实现这个:) - Kinwolf

1

你不需要在那里使用{{ }},只需要:

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

确实,这样就解决了错误。不过之后我又遇到了另一个问题,但是按照下面的建议将“next”移出url标签后问题就消失了。现在我知道如果将其用于url标签内,就不需要{{}}了。 - Kinwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接