【发布时间】:2010-11-20 01:09:46
【问题描述】:
我使用 Django 已经有一段时间了(目前是 1.2 版),但最近才开始开发一个需要支持多个实例的应用程序。例如,项目urls.py 文件将包含它两次,在两个不同的命名空间下,如下所示:
urlpatterns = patterns('',
(r'^instance1/', include('myapp.urls', namespace='instance1')),
(r'^instance2/', include('myapp.urls', namespace='instance2')),
)
我一直很好,直到我意识到我需要弄清楚如何处理对reverse() 的所有内部调用(或对{% url %} 过滤器的模板调用)。例如,假设我在我的一个观点中正在做类似以下的事情:
return HttpResponseRedirect(reverse('view_name'))
或在我的模板之一中使用类似的东西:
<a href="{% url view_name %}">link text</a>
...其中view_name 是myapp.urls 中包含的URL 模式的名称。由于我使用命名空间,这将引发错误:没有名为view_name 的视图。相反,我必须告诉它instance1:view_name 或instance2:view_name。但是动态地做这件事让我很难过。
我做了一些查看,它看起来像 current_app 参数,传递给 Context 或 RequestContext,旨在帮助解决这个问题,但根本不清楚如何动态传递 right 应用程序名称为current_app。那么告诉 Django 使用哪个命名空间的正确方法是什么?
编辑:我的用例是多次使用单个安装的应用程序。也就是说,它只存在于磁盘上一次,但会多次包含在项目的根目录urls.py 中(每次都在不同的命名空间下,如我上面的示例所示)。考虑到这一点,是否有任何好的方法来跟踪正在从哪个命名空间调用视图/模板,并在同一命名空间中使用 reverse() 或 {% url %} ?我知道 Django 1.3 将提供一些额外的功能来帮助解决这个问题(即new and improved resolve()),但现在肯定有一个很好的方法来做到这一点......
【问题讨论】:
-
我对@987654322@ 的回答也适用于此。
标签: django namespaces