【问题标题】:Django redirect from one page to anotherDjango 从一个页面重定向到另一个页面
【发布时间】:2016-12-14 06:02:12
【问题描述】:

我正在使用 Django 进行一个项目,但在单击链接时从一个页面重定向到另一个页面时遇到了问题。无论我尝试了什么,我最终都会得到一个类似的网址:

localhost:8080/page1/page2

而不是从localhost:8080/page1 移动到localhost:8080/page2

我尝试过使用HttpResponseRedirect(url)

【问题讨论】:

  • 您需要确保url 始终以斜杠开头:"/page2"
  • 感谢您的建议@DanielRoseman,但我已经这样做了。
  • 你是如何创建url的?使用reversereverse_lazy?还是渲染时在模板中构建?
  • 在模板中@nkhumphreys
  • 好的,您正在模板中呈现 URL 列表?您是否检查了呈现的 HTML 以查看 URL 的样子?您是在后端使用基于方法的视图还是基于类的视图?

标签: django http-redirect


【解决方案1】:

推荐的方式是在 django 模板中使用{% url 'url-name' arg1 arg2 kwarg='foo' %}。 您不应在模板中硬编码网址,而应使用网址名称。
更多详情:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#url

python 代码中的等价物是django.utls.reverse,它返回绝对网址或django.shortcuts.redirect,它等价于HttpResponseRedirect(reverse('url_name'))
https://docs.djangoproject.com/en/1.10/ref/urlresolvers/#django.urls.reverse

编辑#1

使用数据库在视图之间传递项目。

models.py

from django.db.models import Model

class Item(Model):
    # your model fields

views.py

def list_view(request):
    items = Item.objects.all()
    context = {'items': items}
    return render(request, 'list_template.html', context)

def details_view(request, item_id):
    item = Item.objects.get(id=item_id)
    context = {'item': item}
    return render(request, 'details_template.html', context)

urls.py

urlpatterns = [
    url(r'^/list/$', views.list_view, name='list')
    url(r'^/details/(?P<item_id>[0-9]+)/$', views.details_view, name='details'),
]

list_template.html

<!-- your html -->
<ul>
{% for item in items %}
    <li>
    <a href="{% url 'details' item.id %}">item number {{ item.id }}</a>
    </li>
{% endfor %}
</ul>
<!-- your html -->

{% url ... %} 标记为名为“details”的模式生成绝对 url,并用函数参数替换部分地址。在地址中,您将拥有项目 ID,而不是 (?P&lt;item_id&gt;[0-9]+)/details/1/。当您单击该链接时,数字 1 会被正则表达式抓取并传递给函数参数,您可以在其中从数据库中获取您的项目。

【讨论】:

  • 感谢@warownia1 的帮助。我实际上想要做的是我有一个项目列表,每个项目上都有一个&lt;a&gt; 标签。单击任何项​​目时,我需要重定向到“详细信息”页面,其中详细信息特定于特定项目。我需要把这个项目传递下去。有什么建议吗?
  • 您不能使用 GET 请求传递 python 对象,但您可以传递项目 id 或名称并在详细信息视图中重建项目或从数据库中获取它。是你的意思吗?
  • @warownia1 我刚刚在 Stackoverflow 聊天中帮助了 Venu,并且几乎给出了您在编辑中输入的确切答案。为了避免重复,我要求她将您的答案标记为正确答案:)
  • 好的,太好了。顺便说一句,我不知道 stackoverflow 确实有聊天:p 请将答案标记为正确并关闭主题。
  • 这对我来说也是新闻,当 cmets 的数量太大时它会弹出 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 2014-02-17
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2011-08-22
  • 2021-06-24
相关资源
最近更新 更多