如何在Django中使用urls.py中的变量重定向url模式?

时间:2015-07-27 18:53:53

标签: python django django-urls url-redirection

我想从urls.py重定向带有变量的网址格式

我引用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<id>\d+)/,而不是/permalink/1/

是否有任何解决方案不使用views.py

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

1 个答案:

答案 0 :(得分:12)

url='/permalink/(?P<id>\d+)/'传递给RedirectView将无效,因为该视图不会替换网址中的命名参数。

但是,RedirectView允许您提供pattern_name而不是url重定向到。使用为原始视图传递的相同args和kwargs反转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"),
]

如果目标网址格式使用其他参数,则您无法使用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放在您的视图模块中是一种很好的做法。然后,您可以使用以下内容将视图添加到网址模式中:

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