我想从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模式是否有更简单的解决方案。
答案 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"),
]
如果目标网址格式使用其他参数,则您无法使用url
或pattern_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"),
]