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模式使用其他参数,则不能使用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()
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)
| 归档时间: |
|
| 查看次数: |
3999 次 |
| 最近记录: |