如何在 Django urls.py 中将 url 参数传递给 reverse_lazy
Posted
技术标签:
【中文标题】如何在 Django urls.py 中将 url 参数传递给 reverse_lazy【英文标题】:How to pass url parameter to reverse_lazy in Django urls.py 【发布时间】:2012-04-10 09:03:49 【问题描述】:考虑到我有 1 个资源和 2 个 url(比如说新的和旧的)连接到该资源。所以,我想为其中一个 url 设置 HTTP 重定向。
在myapp/urls.py
我有:
urlpatterns = patterns('',
url(r'^(?P<param>\d+)/resource$',
'myapp.views.resource',
name='resource-view'
),
)
在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'
),
),
)
问题是如何将<param>
传递给reverse_lazy
kwargs(那么,在上面的示例中,用什么代替<???>
)?
【问题讨论】:
【参考方案1】:如果您使用硬编码的 url,重定向视图非常好,它取代了现在已弃用的 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'),
....
)
在此解决方案中,您仍然可以使用 url 模式的名称而不是硬编码的 url。来自 url 的 location_id 参数被传递给 lambda 函数。
【讨论】:
这是这里最聪明的解决方案【参考方案2】:从 Django 1.6 开始,您可以这样做 (Documentation):
...
from django.views.generic.base import RedirectView
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectView.as_view(pattern_name='resource-view'),
),
)
【讨论】:
如果您想将 args 或 kwargs 传递给模式,这是如何工作的? @Flimm 这个答案可能会帮助***.com/a/12150035/742390【参考方案3】:我不会直接在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')
然后,在您的urls.py
中,您可以这样做:
urlpatterns = patterns('',
url(r'^coolresource/(?P<param>\d+)/$',
RedirectSomewhere.as_view()),
)
【讨论】:
使用pattern_name
向下滚动到解决方案,这是Django 1.6及更高版本的正确解决方案【参考方案4】:
一般问题的一种可能解决方案是使用硬编码的 url 模式而不是 reverse_lazy
(documentation)
url(r'^coolresource/(?P<param>\d+)/$',
redirect_to,
'url': '/%(param)s/resource'
),
但是,我不太喜欢它,因为它让我更难对 url 进行可能的更改。
【讨论】:
文档链接?找不到页面 @grgizem 半年前创建的帖子.. 抱歉。无论如何,我已经更新了链接【参考方案5】:Django 的 urls 正则表达式匹配方法允许定义和分配变量:
(?P<variable_name>...)
定义 variable_name
取决于被调用的 uri
;所以你需要输入的是:param
而不是 <???>
【讨论】:
【参考方案6】:在调用视图之前,您无法知道或获取该值是什么,因此请在其中计算url
。
【讨论】:
以上是关于如何在 Django urls.py 中将 url 参数传递给 reverse_lazy的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Django urls.py 识别 url 中的 # (hash)?
如何在 Django 中使用来自 urls.py 的变量重定向 url 模式?
Django 和 urls.py:如何通过命名 url 进行 HttpResponseRedirect?
Django Rest Framework - 如何在 urls.py 中获取 Http 标头信息