如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?
Posted
技术标签:
【中文标题】如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?【英文标题】:How to redirect url pattern with variables from urls.py in Django? 【发布时间】:2015-10-18 02:35:32 【问题描述】:我想从urls.py
重定向url模式带变量。
我参考了other *** 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 模式是否有更简单的解决方案。
【问题讨论】:
【参考方案1】:将 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"),
]
如果目标 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"),
]
【讨论】:
以上是关于如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?的主要内容,如果未能解决你的问题,请参考以下文章
Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?
Django Rest Framework - 如何在 urls.py 中获取 Http 标头信息
如何在 Django tests.py 文件中的每次测试后重新评估我的 urls.py 文件?