关于Django应用名称的困惑
我学习Django的时候,跟着Django的书和文档走。在书里的例子中,项目叫做mysite,里面有一个叫book的应用。所以在这种情况下,这个应用的名字就是“book”。我对此没有问题。
但我对可重用应用有些困惑。可重用应用通常是在项目外面的。例如,django-registration只有一个独立的文件夹“registration”。那么它的应用名字是什么呢?应该是“Registration”,对吧?
如果是这样的话,应用命名是不是有点不一致?在第一个例子中,应用名字似乎是项目下的一个文件夹名字(或者说是子包名),而在第二个例子中,应用名字是顶层包名。
我知道你们大多数人会说:“你为什么这么纠结应用名字?只要包的结构正确,Django就能正常运行。”没错,在大多数情况下,应用名字就是个名字。除了一个特殊情况:指定AUTH_PROFILE_MODULE。正如文档所解释的,
为了表明这个模型是某个网站的用户资料模型,需要在设置中填写AUTH_PROFILE_MODULE,内容是一个字符串,由以下项目用点号分隔:
- 定义用户资料模型的应用名称(区分大小写),也就是在用manage.py startapp创建应用时传入的名字。
- 模型的名字(不区分大小写)。
如果我在一个可重用的包中有一个用户资料模型,我就必须知道应用名字,以便正确指定AUTH_PROFILE_MODULE。
Django是否使用某种路径搜索顺序来决定应用名字呢?
4 个回答
当你把一个应用程序作为独立的包发布时,它其实就是一个普通的Python包,只不过这个包里面实现了Django的视图、模板、模板标签等等。因此,Django查找东西的路径就是Python查找东西的路径。这就是为什么人们会说“只要确保包的结构正确,Django就能顺利运行。”
显然,如果你的包名和其他人的包名冲突了,那你就会遇到问题……
我对可重用应用程序有些困惑。可重用的应用程序通常在项目之外。例如,django-registration 只有一个独立的文件夹“registration”。那么它的应用名称是什么呢?是“Registration”,对吧?
django-registration
是项目名称,而应用名称是 registration
:
- 在应用列表中,你只使用应用名称:
registration
- 在其他地方你会用到
import registration
如果是这样的话,应用命名是不是有点不一致?在第一种情况下,应用名称似乎是项目下的一个文件夹名称(或者子包名称),而在第二种情况下,应用名称是顶层包名称。
可以把项目想象成一个简单的应用集合:你可以把应用存放在子文件夹中,或者放在一个单独的文件夹里(这个文件夹必须包含在 PYTHONPATH 中)。在这两种情况下,应用名称都是一样的。
更新
manage.py
会将当前文件夹(这样你可以使用 import app.module
)和父文件夹(这样你可以使用 project.settings
和 project.urls
)都添加到 PYTHONPATH 中。所以,如果你能配置 Pydev 将项目文件夹添加到 PYTHONPATH,那么你就可以像 app.module
一样导入这些应用,而不需要关心项目名称。
这个应用的名字就是它所在文件夹的名字,大小写都要一样,除非你特意去__init__.py
文件里改名字。毕竟,Django的应用其实就是Python模块,所以所有的规则都是一样的。
如果你看到某个应用或模块的名字大小写不一样或者有其他修改,那并不代表实际的应用或模块名字。你看到的只是Django管理应用在某些情况下做的“美化显示”。这只是为了好看而已。