Django:将项目分成应用程序的最佳实践

bas*_*kum 32 django django-apps

我真的在努力应对这整个应用程序的想法.我阅读了很多教程和样式指南,我知道我应该尝试创建专门的应用程序,这只做一件事.在查看一些简单的教程项目时,这一切都很有意义,但一旦进入复杂的现实生活项目,我发现自己无法确定应该如何划分不同应用程序之间的界限.

其中一个问题是,我希望有一个站点(或多个站点),用户可以看到很多不同的东西.遵循应用程序设计规则时应该来自不同应用程序的东西.我怎么会意识到这样的事情?我的第一个想法是创建一个名为ui的应用程序,它只处理实际导致模板的所有视图,所有其他应用程序提供模型和辅助功能.但我担心该ui应用程序会变得很大.

举个小例子:让我想拥有一个用户可以执行以下任务的站点:

  • 选择一个主题
  • 为选定的主题设置一些选项
  • 上传与其帐户关联的文件
  • 将一些上传的文件分配给主题
  • 录制一些与主题相关的音频

现在,我会创建三个应用程序:

  1. 科目(包含主题模型和一些相关模型)
  2. 资源(包含资源模型,处理上传)
  3. 音频(处理所有录音和处理的东西)

但是,我需要某种mainui应用程序来处理这些应用程序的交互方式以及创建实际网站,其中所有应用程序都以某种方式参与其中.

那么,有没有"正确"的方法来做到这一点?或者我可以使用任何模式吗?我也很欣赏有关这个主题的良好资源的链接,尽管我已经阅读了不少内容.

Hed*_*ide 11

您只需要确保您的结构对有意义.

没有必要为绑定到项目逻辑的另一部分的每个功能创建新的应用程序.

可重用的应用程序是一个完全不同的故事,它们的代码应该在某种程度上不知道实现.

看看Django的灵感结构

您的示例的可能布局:

project_root/
    project/
        __init__.py
        settings.py
        urls.py
        templates/
            app1/  # override stuff
        static/
        media/
    app1/
        __init__.py
        admin/  # as a package
            __init__.py
            subjects.py
            resources.py
            # etc
        models/  # as a package
            subjects.py
            resources.py
            # etc
        managers/
            __init__.py
            subjects.py
            resources.py
            # etc
        services/
            __init__.py
            audio.py  # upload handler etc
        views/
            __init__.py
            subjects.py
        urls/
            __init__.py
            subjects.py
        templates/
            app1/
                subject_list.html  # override at project level
        static/
            app1/
                css/
                    subject.css  # override at project level
    app2/
        __init__.py
        models.py  # holds a Member model or whatever you require
    manage.py
Run Code Online (Sandbox Code Playgroud)


Jor*_*tao 10

我认为划分应用程序的最佳方法大致相当于在Objected Oriented Programming Language上划分类的方式.您可以分别考虑模型和视图,而不是变量和方法:

模型是对象的状态,视图用于查看对象的状态并与之交互.

我的经验法则是,创建应用程序是否有助于封装一组特定的模型?如果是这种情况,那么我尝试创建它.