【问题标题】:How to redirect url pattern with variables from urls.py in Django?如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?
【发布时间】:2015-10-18 02:35:32
【问题描述】:

我想从urls.py重定向url模式带变量

我参考了other stackoverflow solution,但我不知道 url 什么时候有类似以下代码的变量。

from django.conf.urls import patterns, url
from django.views.generic import RedirectView


urlpatterns = patterns(
    url(
        r'^permalink/(?P<id>\d+)/foo/$',
        RedirectView.as_view(url='/permalink/(?P<id>\d+)/')
    ),
)

使用此代码,django 会将/permalink/1/foo/ 重定向到/permalink/(?P&lt;id&gt;\d+)/,而不是/permalink/1/

有什么解决方法不使用views.py

我当然知道使用控制器的解决方案,但我想知道使用 url 模式是否有更简单的解决方案。

【问题讨论】:

    标签: python django django-urls url-redirection


    【解决方案1】:

    url='/permalink/(?P&lt;id&gt;\d+)/' 传递给 RedirectView 将不起作用,因为视图不会替换 url 中的命名参数。

    但是,RedirectView 允许您提供 pattern_name 而不是 url 以重定向到。使用为原始视图传递的相同 args 和 kwargs 反转 url。

    这适用于您的情况,因为两种 url 模式都有一个命名参数 id

    urlpatterns = [
        url(r'^permalink/(?P<id>\d+)/foo/$',
            RedirectView.as_view(pattern_name="target_view"),
            name="original_view"),
        url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
    ]
    

    如果目标 url 模式使用其他参数,则不能使用 urlpattern_name。相反,您可以继承 RedirectView 并覆盖 get_redirect_url

    from django.core.urlresolvers import reverse
    from django.views.generic import RedirectView
    
    class QuerystringRedirect(RedirectView):
        """
        Used to redirect to remove GET parameters from url
    
        e.g. /permalink/?id=10 to /permalink/10/   
        """
    
        def get_redirect_url(self):
            if 'id' in self.request.GET:
                return reverse('target_view', args=(self.request.GET['id'],))
            else:
                raise Http404()
    

    QuerystringRedirect 放在您的视图模块中是一种很好的做法。然后,您可以使用以下内容将视图添加到您的 url 模式:

    urlpatterns = [
        url(r'^permalink/$', views.QuerystringRedirect.as_view(), name="original_view"),
        url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 2013-03-20
      • 2014-08-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2012-04-12
      • 2016-12-08
      相关资源
      最近更新 更多