【问题标题】:Redirect to named url pattern directly from urls.py in django?直接从 django 中的 urls.py 重定向到命名的 url 模式?
【发布时间】:2013-03-20 08:18:22
【问题描述】:

在 Django 中,如何直接从 urls.py 进行简单的重定向?自然我是一个组织良好的人,喜欢 DRY 原则,所以我想根据它的命名 url 模式来获取目标,而不是硬编码 url。

【问题讨论】:

    标签: django redirect


    【解决方案1】:

    如果你使用的是 Django 1.4 或 1.5,你可以这样做:

    from django.core.urlresolvers import reverse_lazy
    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        url(r'^some-page/$', RedirectView.as_view(url=reverse_lazy('my_named_pattern'), permanent=False)),
        ...
    

    如果你使用的是 Django 1.6 或更高版本,你可以这样做:

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        url(r'^some-page/$', RedirectView.as_view(pattern_name='my_named_pattern', permanent=False)),
        ...
    

    在 Django 1.9 中,permanent 的默认值已从 True 更改为 False。因此,如果您不指定 permanent 关键字参数,您可能会看到以下警告:

    RemovedInDjango19警告:在 Django 1.9 中,“RedirectView.permanent”的默认值将从 True 更改为 False。设置一个显式值以消除此警告。

    【讨论】:

    • 请注意,请记住 RedirectView 默认设置为 Permanent=True。
    • 您可以重定向所有内容!像这样:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
    • RedirectView 在 Django 1.9 中默认设置为 Permanent=False。
    • 有人能解释一下上面例子中的“my_named_pa​​ttern”是什么吗?
    • pattern_name 参数传递给RedirectView 在调用时使用给定的模式名称为您执行反向操作。其他useful parameters include permanent and query_string.
    【解决方案2】:

    这对我有用。

    from django.views.generic import RedirectView
    
    urlpatterns = patterns('',
        url(r'^some-page/$', RedirectView.as_view(url='/')),
        ...
    

    在上面的例子中'/' 表示它将重定向到索引页面, 您还可以在其中添加任何 url 模式。

    【讨论】:

    • 请注意,请记住 RedirectView 在旧版本的 Django 中默认为 permanent=True,在 Django >= 1.9 版本中默认为 permanent=False
    【解决方案3】:

    django v2+

    from django.contrib import admin
    from django.shortcuts import redirect
    from django.urls import path, include
    
    
    urlpatterns = [
        # this example uses named URL 'hola-home' from app named hola
        # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
        path('', lambda request: redirect('hola/', permanent=False)),
        path('hola/', include("hola.urls")),
        path('admin/', admin.site.urls),
    ]
    

    【讨论】:

    【解决方案4】:

    如果你不支持 RedirectView,旧版本的 django 支持这种方式

    在view.py中

    def url_redirect(request):
        return HttpResponseRedirect("/new_url/")
    

    在 url.py 中

    url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
    

    您可以使用HttpResponsePermanentRedirect使其永久化

    【讨论】:

      【解决方案5】:

      我试图将所有 404 重定向到主页,但效果很好:

      from django.views.generic import RedirectView
      ...
      under urlpatterns, added:
          url(r'^.*/$', RedirectView.as_view(url='/home/')),
          url(r'^$', RedirectView.as_view(url='/home/')),
      

      【讨论】:

        【解决方案6】:

        您可以直接在 urls.py 上执行以下操作:

        url(r'^story/(?P<pk>\d+)/',
                lambda request, pk: HttpResponsePermanentRedirect('/new_story/{pk}'.format(pk=pk)))
        

        只需确保您准备好接收重定向的新 URL! 另外,请注意重定向的类型,在我使用 Permanent Redirect

        的示例中

        【讨论】:

          猜你喜欢
          • 2015-10-18
          • 2014-10-05
          • 2015-03-09
          • 2014-08-01
          • 2014-01-03
          • 1970-01-01
          • 2015-05-06
          • 2014-11-23
          • 2016-12-08
          相关资源
          最近更新 更多