如何在 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 模式使用其他参数,则不能使用 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
放入您的视图模块中。然后,您可以将视图添加到您的 url 模式中,例如:
urlpatterns = [
url(r'^permalink/$', views.QuerystringRedirect.as_view(), name="original_view"),
url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
]
我想从 urls.py
.
我参考了 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 模式使用其他参数,则不能使用 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
放入您的视图模块中。然后,您可以将视图添加到您的 url 模式中,例如:
urlpatterns = [
url(r'^permalink/$', views.QuerystringRedirect.as_view(), name="original_view"),
url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
]