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

Che*_*mer 8 python django django-urls url-redirection

我想来自的变量重定向url模式urls.py.

我引用 其他stackoverflow解决方案,但我不知道什么时候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+)/')
    ),
)
Run Code Online (Sandbox Code Playgroud)

使用此代码,django将重定向/permalink/1/foo//permalink/(?P<id>\d+)/,而不是/permalink/1/.

没有使用的views.py解决方案?

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

Ala*_*air 13

传递url='/permalink/(?P<id>\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"),
]
Run Code Online (Sandbox Code Playgroud)

如果目标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()
Run Code Online (Sandbox Code Playgroud)

放入QuerystringRedirect您的视图模块是一个好习惯.然后,您可以使用以下内容将视图添加到网址模式:

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