gpt4 book ai didi

django - 在 Django : multiple instances of the same app 中反转命名空间 URL

转载 作者:行者123 更新时间:2023-12-04 01:01:17 25 4
gpt4 key购买 nike

我已经使用 Django 一段时间了(目前是 1.2 版),但最近才开始开发一个需要支持多个实例的应用程序。例如,项目 urls.py file 将在两个不同的命名空间下包含它两次,如下所示:

urlpatterns = patterns('',
(r'^instance1/', include('myapp.urls', namespace='instance1')),
(r'^instance2/', include('myapp.urls', namespace='instance2')),
)

我一切顺利,直到我意识到我需要弄清楚如何处理所有对 reverse() 的内部调用。 (或模板调用 {% url %} 过滤器)。例如,假设我在其中一个 View 中执行以下操作:
return HttpResponseRedirect(reverse('view_name'))

或我的模板之一中的类似内容:
<a href="{% url view_name %}">link text</a>

...哪里 view_name是包含在 myapp.urls 中的 URL 模式的名称.由于我使用的是命名空间,这将引发一个错误:没有名为 view_name 的 View 。 .相反,我必须告诉它 instance1:view_nameinstance2:view_name .但是动态地做这件事让我很难过。

我做了一些查找,它看起来像 current_app参数,传递给 ContextRequestContext , 旨在帮助解决此问题,但根本不清楚如何将正确的应用程序名称动态传递给 current_app .那么告诉 Django 使用哪个命名空间的正确方法是什么?

编辑:我的用例是多次使用应用程序的单个安装。也就是说,它只在磁盘上存在一次,但在项目的根目录中多次包含 urls.py (每次都在不同的命名空间下,就像我上面的例子一样)。考虑到这一点,有什么好的方法可以跟踪调用 View /模板的 namespace ,并充分利用 reverse(){% url %}坚持在同一个命名空间内?我知道 Django 1.3 将提供一些可以帮助解决这个问题的额外功能(即 new and improved resolve() ),但现在肯定有一个很好的方法来做到这一点......

最佳答案

自从问题发布以来发生了很多变化,但对于 future 的谷歌员工(比如我自己)来说,指出 request 可能会很有用。现在拥有命名空间(至少从 1.7 开始,如 this example 所示。

据我了解,我们应该能够简单地通过 current_app reverse 的位置参数/redirect但我无法让它工作,所以我最终为此创建了一个帮助方法:

def __redirect(request, viewname, *args, **kwargs):
to = viewname

if callable(to):
to = viewname.__module__ + '.' + viewname.__name__
if request.resolver_match.namespace:
to = '%s:%s' % (request.resolver_match.namespace, to)

return redirect(
to,
*args,
**kwargs
)

我正在使用 redirect在这里,但所有参数都传递给 reverse ,所以是一样的。

关于django - 在 Django : multiple instances of the same app 中反转命名空间 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4230687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com