gak*_*hov 21 django django-urls
考虑到我有1个资源和2个网址(让我们说新的和旧的)连接到该资源.所以,我想为其中一个网址设置HTTP重定向.
在myapp/urls.py
我有:
urlpatterns = patterns('',
url(r'^(?P<param>\d+)/resource$',
'myapp.views.resource',
name='resource-view'
),
)
Run Code Online (Sandbox Code Playgroud)
在mycoolapp/urls.py
我想指定:
from django.views.generic.simple import redirect_to
from django.core.urlresolvers import reverse_lazy
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
{
'url': reverse_lazy('resourse-view',
kwargs={'param': <???>},
current_app='myapp'
),
}
),
)
Run Code Online (Sandbox Code Playgroud)
问题是如何传递<param>
给reverse_lazy
kwargs(那么,<???>
在上面的例子中放置什么)?
slu*_*rms 19
我不会直接在其中执行此操作urls.py
,而是使用基于类的RedirectView
计算视图以重定向到:
from django.views.generic.base import RedirectView
from django.core.urlresolvers import reverse_lazy
class RedirectSomewhere(RedirectView):
def get_redirect_url(self, param):
return reverse_lazy('resource-view',
kwargs={'param': param},
current_app='myapp')
Run Code Online (Sandbox Code Playgroud)
然后,urls.py
你可以这样做:
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectSomewhere.as_view()),
)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是硬编码网址,则重定向视图非常有用,它取代了现在已弃用的redirect_to.从urls.py重定向和反转时,我认为你不能使用它.这是我的解决方案,x是这种情况下的响应对象:
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
....
url(r'^coolresource/(?P<param>\d+)/$',
lambda x, param: HttpResponseRedirect(
reverse('myapp.views.resource', args=[param])
),
name='resource-view-redirect'),
....
)
Run Code Online (Sandbox Code Playgroud)
您仍然可以使用此解决方案使用url模式的名称而不是硬编码的URL.来自url的location_id参数向下传递给lambda函数.
从 Django 1.6 开始,您可以这样做(文档):
...
from django.views.generic.base import RedirectView
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectView.as_view(pattern_name='resource-view'),
),
)
Run Code Online (Sandbox Code Playgroud)
一般问题的可能解决方案之一是使用硬编码的 url 模式而不是reverse_lazy
(文档)
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
{'url': '/%(param)s/resource'}
),
Run Code Online (Sandbox Code Playgroud)
但是,我不太喜欢它,因为它让我更难对网址进行可能的更改。
归档时间: |
|
查看次数: |
30223 次 |
最近记录: |