首页 文章

什么是Django中的reverse()

提问于
浏览
158

当我有时阅读django代码时,我会看到一些模板 reverse() . 我不太清楚这是什么,但它与HttpResponseRedirect一起使用 . 应该如何以及何时使用 reverse()

如果有人用一些例子给出答案,那就太好了......

5 回答

  • 4

    https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse

    在_1414106中定义:

    url(r'^foo$', some_view, name='url_name'),
    

    在模板中,您可以将此网址引用为:

    <!-- django <= 1.4 -->
    <a href="{% url url_name %}">link which calls some_view</a>
    
    <!-- django >= 1.5 or with {% load url from future %} in your template -->
    <a href="{% url 'url_name' %}">link which calls some_view</a>
    

    这将呈现为

    <a href="/foo/">link which calls some_view</a>
    

    现在说你想在你的_1414110中做类似的事情 - 例如你正在处理其他一些视图中的其他URL(不是 /foo/ )(而不是 some_view )并且你想将用户重定向到 /foo/ (通常是成功提交表单的情况)

    你可以这样做

    return HttpResponseRedirect('/foo/')
    

    但是如果你想在将来更改网址怎么办 - 你必须在你的代码中更新你的 urls.py 以及它的所有引用 . 这违反了DRY(google it) .

    相反,你可以说

    from django.urls import reverse
    return HttpResponseRedirect(reverse('url_name'))
    

    这将查看项目中为名称为 url_name 定义的url定义的所有URL,并返回实际的url /foo/ .

    这意味着您仅通过其 name 属性引用该网址 - 如果您想要更改网址本身或其引用的视图,您可以通过仅编辑一个地方来执行此操作 - urls.py . 编辑一个地方的整个想法被称为"Don't Repeat Yourself"并且是值得努力的东西 .

  • 2

    这是一个古老的问题,但这可能对某些人有所帮助 .

    来自官方文档:

    Django提供了用于执行URL反转的工具,这些工具匹配需要URL的不同层:在模板中:使用url模板标记 . 在Python代码中:使用reverse()函数 . 在与处理Django模型实例的URL相关的更高级代码中:get_absolute_url()方法 .

    例如 . 在模板中(url标签)

    <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
    

    例如 . 在python代码中(使用 reverse 函数)

    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
    
  • 5

    有一个文件

    https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

    它可用于生成给定视图的URL

    主要优点是您不需要在代码中硬编码路由 .

  • 0

    该功能支持干燥原则 - 确保您不会在整个应用程序中硬编码网址 . 网址应该在一个地方定义,而且只能在一个地方定义 - 您的网址 . 之后你真的只是引用那些信息 .

    使用 reverse() 为您提供页面的URL,给定视图的路径或url conf中的page_name参数 . 如果使用 {% url 'my-page' %} 在模板中进行此操作没有意义,则可以使用它 .

    您可以使用此功能的许多地方 . 我发现我使用它的一个地方是在视图中重定向用户(通常在成功处理表单之后) -

    return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))

    您也可以在编写模板标签时使用它 .

    我用 reverse() 的另一次是模型继承 . 我在父模型上有一个ListView,但是希望从这些父对象中的任何一个获得它与其关联的子对象的DetailView . 我将一个 get__child_url() 函数附加到父级,该父级确定了子级的存在,并使用 reverse() 返回了它的详细信息视图的URL .

  • 253

    reverse()用于遵循django DRY原则,即如果您将来更改URL,则可以使用reverse(urlname)引用该URL .

相关问题