Django URL名称空间概念

时间:2015-02-08 17:37:58

标签: django url namespaces

简单问题:在视图层中动态确定Django应用程序的URL命名空间并将结果作为上下文的一部分传递给模板有什么缺点吗?为什么Django不会将其作为默认行为?

背后的想法:我理解命名空间是一个好主意,可以帮助Django在我的视图中找到正确的URL,即使它们在一个更大的项目中没有唯一的名称。他们也可以帮助我可能想要在我不知道或想要对URL进行硬编码的其他应用程序中查看视图。

但我仍然在思考在Django中实现URL名称空间概念的方式。据我所知,Django中的应用程序是“可移植的”,因此它们可以放入python包中,并在另一个Django项目中重用,而不会让人头疼。所以我希望我的应用程序应该能够在任何名称空间内运行(甚至根本不运行)另一个Django项目可能会分配给它。

但是,如果我将我的命名空间硬编码到我的应用程序的模板和视图中(显然似乎是由官方Django文档强制执行),这是另一个Django项目必须尊重的东西。我的应用程序不能在没有该命名空间的情况下使用。如果在该项目中碰巧有另一个具有相同命名空间的应用程序,那么映射到非唯一视图名称的一些URL可能是错误的。

我实际上正在考虑通过动态确定给定的命名空间并将其传递到用于渲染我的模板的上下文来解决我的问题。所以在我的视图函数中(在views.py中)我会有这样的行:

namespace = request.resolver_match.namespace+':' if request.resolver_match.namespace!='' else ''
context = { 'objects': object_list , 'namespace': namespace}
return render(request, 'MyApp/object.html', context)
...
return HttpResponseRedirect(reverse(namespace + 'detail', args=(object.id,)))

在我的模板文件中,我现在可以写:

<a href="{% url namespace|add:'detail' object.id %}">{{ object.name }}</a>

这种方式我似乎能够使用我的应用程序有或没有命名空间,甚至在项目urls.py下不同名称空间下多次(为什么我会这样做 - 除了模糊我的网址中的参数-设计?)。当然,如果需要知道我希望链接到的外部应用程序视图的命名空间,可能无法避免命名空间 - 硬编码,除非可能将第二个命名空间放入上下文中。

0 个答案:

没有答案