我正在研究Django文档,但我遇到了一个我无法理解的部分:在实际问题中如何使用名称空间的真实示例是什么.我知道语法,但我不知道这样做的目的.

推荐答案

通常,它们用于将每个应用程序的URL放入各自的命名空间.这可以防止reverse()Django函数和{% url %}模板函数返回错误的URL,因为URL模式名称恰好在另一个应用程序中匹配.

我的项目级urls.py文件中有以下内容:

from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', 'main.views.main', name='main'),
    url(r'^login$', 'django.contrib.auth.views.login', name="login"),
    url(r'^logout$', 'django.contrib.auth.views.logout',
        {"next_page": "/"}, name="logout"),

# Admin
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

# Auto-add the applications.
for app in settings.LOCAL_APPS:
    urlpatterns += patterns('',
        url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)),
    )

请注意最后一部分:这将判断我安装的应用程序(settings.LOCAL_APPS是我添加的一个设置,它只包含我的应用程序;它被添加到INSTALLED_APPS,其中包含South等其他内容),在每个应用程序中查找urls.py,并将这些URL导入以应用程序命名的命名空间,还将这些URL放入以应用程序命名的URL子目录.

例如,如果我有一个名为hosts的应用程序,hosts/urls.py看起来像:

from django.conf.urls.defaults import *

urlpatterns = patterns('hosts.views',
    url(r'^$', 'show_hosts', name='list'),
)

现在我的views.py可以呼叫reverse("hosts:list")来获取调用hosts.views.show_hosts的页面的URL,它看起来类似于"/hosts/".模板中的{% url "hosts:list" %}也是如此.这样,我就不必担心与另一款应用程序中名为"list"的URL发生冲突,也不必在每个名字前都加上hosts_的前缀.

请注意,登录页面为{% url "login" %},因为它没有给定名称空间.

Django相关问答推荐

Django中的判断约束

Django Rest Framework 速率限制动态基于用户类型

如何使用具有某些权限的 Django 组的转储数据和加载数据?

防止 django 将_id附加到外键字段

Playframework 和 Django

Django - 将 HTML 输出转换为变量

Django 模型中的隐藏字段

如何在 PyCharm 中重命名 Django 元素?

Django 相当于 COUNT 和 GROUP BY

Django Admin - 覆盖自定义表单字段的小部件

Django App 配置不当 - 应用程序模块有多个文件系统位置

Django admin:我可以定义字段顺序吗?

在 Django 中获取下一个和上一个对象

Django 模板:通过扩展模板覆盖包含的子模板块

Django ALLOWED_HOSTS IP 范围

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

从表单获取模型实例而不保存

在 Django 开发服务器中关闭静态文件的缓存

想要在 Django 测试中禁用信号

Numpy 数组到 base64 并返回到 Numpy 数组 - Python