【问题标题】:How to pass url parameter to reverse_lazy in Django urls.py如何在 Django urls.py 中将 url 参数传递给 reverse_lazy
【发布时间】: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'
                                 ),
                       }
   ),
)

问题是如何将&lt;param&gt; 传递给reverse_lazy kwargs(那么,在上面的示例中,用什么代替&lt;???&gt;)?

【问题讨论】:

    标签: django django-urls


    【解决方案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'),
        ),
    ) 
    

    【讨论】:

    【解决方案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&lt;variable_name&gt;...) 定义 variable_name 取决于被调用的 uri;所以你需要输入的是:param 而不是 &lt;???&gt;

    【讨论】:

      【解决方案6】:

      在调用视图之前,您无法知道或获取该值是什么,因此请在其中计算url

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-06
        • 2014-07-08
        • 2021-03-30
        • 2016-04-22
        • 2021-03-22
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多