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

How to redirect url pattern with variables from urls.py in Django?

我想从 urls.py.

使用变量 重定向 url 模式

我参考了 other Whosebug 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 模式的更简单的解决方案。

url='/permalink/(?P<id>\d+)/' 传递给 RedirectView 将不起作用,因为视图不会替换 url.

中的命名参数

但是,RedirectView 允许您提供 pattern_name 而不是要重定向到的 url。 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"),
]

如果目标 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"),
]