【问题标题】:Django: How to return to previous URLDjango:如何返回到以前的 URL
【发布时间】:2016-03-09 14:55:17
【问题描述】:

这里是新手,他学习了使用 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)

注意:如果我根据网络上似乎总是使用 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 中执行此操作的方法是什么?它看起来像一个非常基本的功能,所以我认为它会更容易。

【问题讨论】:

  • 如果您链接到您尝试过但不起作用的解决方案,这可能会有所帮助。我想不出为什么 Django 1.5 的解决方案今天行不通。请注意,redirect 是多年前在 Django 1.1 中添加的。使用HttpResponseRedirect 没问题,如果您愿意,也可以轻松转换为使用redirect

标签: django django-templates django-views


【解决方案1】:

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

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

在您看来,您可以从request.GET 获取next,并使用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)

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

【讨论】:

  • 谢谢,这正是我正在寻找的额外信息。它工作得很好,我现在有正确的方法在 django 中执行此操作:)
【解决方案2】:

那里不需要{{ }},只需:

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

【讨论】:

  • 确实,这消除了错误。虽然在那之后我有另一个,但问题通过将“下一个”从 url 标签中移出,如下所示。但现在我知道如果我在 url 标记中使用它,我不需要 {{}}。
猜你喜欢
  • 2022-01-20
  • 2021-01-16
  • 1970-01-01
  • 2011-06-17
  • 2020-11-06
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多