如果你有能力开发适合自己的应用,你可以在user_space中进行自行开发。

使用python manage.py create_app my_app,可快速创建插件开发目录,支持传统模式和文件夹模式.python manage.py create_app --help可查看全部功能

usage: manage.py create_app [-h] [--description DESCRIPTION] [--no-deps] [--no-reqs]
                            [--traditional] [--minimal] [--version] [-v {0,1,2,3}]
                            [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback]   
                            [--no-color] [--force-color] [--skip-checks]
                            app_name

在user_space/apps/目录下创建新的CMS应用包(支持两种结构模式)

positional arguments:
  app_name              应用名称

options:
  -h, --help            show this help message and exit
  --description DESCRIPTION
                        应用描述
  --no-deps             不创建dependencies.txt文件
  --no-reqs             不创建requirements.txt文件
  --traditional         使用传统单文件结构(而不是模块化目录结构)
  --minimal             创建最小化结构(只包含必需文件)
  --version             Show program's version number and exit.
  -v, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output, 2=verbose       
                        output, 3=very verbose output
  --settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be used.
  --pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Display a full stack trace on CommandError exceptions.
  --no-color            Don't colorize the command output.
  --force-color         Force colorization of the command output.
  --skip-checks         Skip system checks.

模式对比

1. 模块化目录结构(默认模式)

 
python manage.py create_app blog
 
 
方法说明
  • 默认模式,无需额外参数
  • 使用admin/models/views/utils/等目录组织代码
  • 适合大型复杂应用,便于代码管理和团队协作
目录树结构
 
blog/
├── admin/                    # 后台管理配置目录
│   ├── __init__.py
│   └── example.py
├── models/                   # 数据模型目录
│   ├── __init__.py
│   └── example.py
├── views/                    # 视图目录
│   ├── __init__.py
│   └── example.py
├── utils/                    # 工具函数目录
│   ├── __init__.py
│   └── helpers.py
├── templatetags/            # 自定义模板标签目录
│   ├── __init__.py
│   ├── blog_filters.py
│   └── blog_tags.py
├── migrations/              # 数据库迁移目录
│   └── __init__.py
├── templates/               # 模板文件目录
│   └── blog/
│       └── base.html
├── static/                  # 静态文件目录
│   └── blog/
│       ├── css/
│       │   └── style.css
│       ├── js/
│       │   └── main.js
│       └── images/
│           └── README.md
├── __init__.py
├── admin.py                # 统一入口文件(导入admin/目录)
├── apps.py
├── dependencies.txt
├── forms.py
├── models.py              # 统一入口文件(导入models/目录)
├── requirements.txt
├── serializers.py
├── tests.py
├── urls.py
└── views.py              # 统一入口文件(导入views/目录)
 
 

2. 传统单文件结构(传统模式)

 
python manage.py create_app forum --traditional
 
 
方法说明
  • 使用--traditional参数
  • 使用admin.pymodels.pyviews.py等单文件结构
  • 符合Django标准结构,适合小型简单应用
目录树结构
 
forum/
├── migrations/              # 数据库迁移目录
│   └── __init__.py
├── templates/              # 模板文件目录
│   └── forum/
│       └── base.html
├── static/                 # 静态文件目录
│   └── forum/
│       ├── css/
│       │   └── style.css
│       ├── js/
│       │   └── main.js
│       └── images/
│           └── README.md
├── __init__.py
├── admin.py               # 单文件,包含所有admin配置
├── apps.py
├── dependencies.txt
├── forms.py
├── models.py             # 单文件,包含所有模型定义
├── requirements.txt
├── serializers.py
├── tests.py
├── urls.py
└── views.py              # 单文件,包含所有视图函数
 
 

使用示例

示例1:创建博客系统(模块化结构)

 
python manage.py create_app blog --description="博客管理系统"
 
 
创建的文件
 
blog/
├── admin/                    # admin配置目录
│   ├── __init__.py
│   └── example.py           # 示例admin配置
├── models/                   # 模型目录
│   ├── __init__.py
│   └── example.py           # 示例模型
├── views/                    # 视图目录
│   ├── __init__.py
│   └── example.py           # 示例视图
├── utils/                    # 工具函数
│   ├── __init__.py
│   └── helpers.py           # 工具函数示例
├── templatetags/            # 模板标签
│   ├── __init__.py
│   ├── blog_filters.py      # 自定义过滤器
│   └── blog_tags.py         # 自定义标签
└── ...(其他文件)
 
 
示例模型文件​ (blog/models/example.py):
 
from django.db import models

class ExampleModel(models.Model):
    """示例模型"""
    name = models.CharField('名称', max_length=100)
    description = models.TextField('描述', blank=True)
    created_at = models.DateTimeField('创建时间', auto_now_add=True)

    def __str__(self):
        return self.name
 
 
添加新模型​ (blog/models/post.py):
 
from django.db import models

class Post(models.Model):
    title = models.CharField('标题', max_length=200)
    content = models.TextField('内容')
    created_at = models.DateTimeField('创建时间', auto_now_add=True)

    def __str__(self):
        return self.title
 
 
在models/init.py中导入
 
from .example import ExampleModel
from .post import Post

__all__ = ['ExampleModel', 'Post']
 
 
对应的admin配置​ (blog/admin/post.py):
 
from django.contrib import admin
from ..models.post import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['title', 'created_at']
    search_fields = ['title']
 
 

示例2:创建简单工具应用(传统结构)

 
python manage.py create_app calculator --traditional --description="计算器工具"
 
 
创建的文件
 
calculator/
├── __init__.py
├── admin.py               # 单文件admin配置
├── models.py             # 单文件模型定义
├── views.py              # 单文件视图函数
└── ...(其他文件)
 
 
单文件模型定义​ (calculator/models.py):
 
from django.db import models

class ExampleModel(models.Model):
    """示例模型"""
    name = models.CharField('名称', max_length=100)
    description = models.TextField('描述', blank=True)
    created_at = models.DateTimeField('创建时间', auto_now_add=True)

    def __str__(self):
        return self.name

# 在此直接添加更多模型
class Calculation(models.Model):
    """计算记录"""
    expression = models.CharField('表达式', max_length=200)
    result = models.DecimalField('结果', max_digits=10, decimal_places=2)
    created_at = models.DateTimeField('计算时间', auto_now_add=True)

    def __str__(self):
        return f"{self.expression} = {self.result}"
 
 
单文件admin配置​ (calculator/admin.py):
 
from django.contrib import admin
from .models import ExampleModel, Calculation

@admin.register(ExampleModel)
class ExampleModelAdmin(admin.ModelAdmin):
    list_display = ['name', 'created_at']

@admin.register(Calculation)
class CalculationAdmin(admin.ModelAdmin):
    list_display = ['expression', 'result', 'created_at']
 
 

两种模式的对比表

特性
模块化目录结构
传统单文件结构
创建命令
python manage.py create_app appname
python manage.py create_app appname --traditional
结构特点
按功能分目录,模块化组织
按文件类型分文件,集中管理
适用场景
大型复杂应用,多模型/多视图
小型简单应用,功能单一
代码组织
高内聚,低耦合
集中管理,便于查找
文件数量
较多
较少
团队协作
减少冲突,便于分工
容易产生冲突
维护性
高,便于扩展和维护
中,文件过大会难以维护
Django兼容
完全兼容
完全兼容
学习曲线
稍高
简单

推荐使用场景

使用模块化目录结构的场景:

  1. 大型系统:如电商平台、CMS系统
  2. 复杂功能:涉及多个模块,如用户、商品、订单
  3. 团队开发:多人协作,需要代码分离
  4. 长期维护:需要持续迭代和扩展
  5. 代码复用:需要在不同项目中复用模块

使用传统单文件结构的场景:

  1. 小型工具:如计算器、单位转换
  2. 简单功能:只有1-2个模型和视图
  3. 快速原型:验证概念,快速开发
  4. 个人项目:单人开发,无需复杂结构
  5. 教学示例:便于理解和演示

如何选择?

  1. 如果你不确定,使用模块化目录结构(默认):
    • 更灵活,便于后续扩展
    • 即使现在简单,以后也可以轻松扩展
    • 培养良好的代码组织习惯
  2. 只有明确知道应用很小且不会扩展时,才使用传统结构
    • 真正的微型工具应用
    • 一次性脚本或简单接口
    • 概念验证项目

混合使用建议

在实际项目中,你可以:
  • 使用模块化结构创建主要应用
  • 使用传统结构创建简单的工具应用
  • 在模块化应用中,也可以将某些简单功能放在单文件中

创建命令的完整选项

 
# 完整语法
python manage.py create_app APP_NAME [options]

# 常用选项组合
python manage.py create_app blog                     # 模块化结构
python manage.py create_app forum --traditional      # 传统结构
python manage.py create_app api --minimal            # 最小化模块化结构
python manage.py create_app tool --traditional --minimal  # 最小化传统结构
python manage.py create_app shop --no-deps           # 不创建依赖文件
python manage.py create_app news --description="新闻系统"  # 添加描述
 
 
通过这两种模式,您可以根据应用的具体需求选择最合适的代码组织结构。

 

核心逻辑说明

user_space路径用来第三方开发,具体结构如下:

传统模式

user_space
|-apps#应用路径,可以在apps下加入完整的应用包
|--appname
|---migrations
|---__init__.py#包声明文件
|---admin.py
|---apps.py
|---models.py
|---urls.py
|---tests.py
|---views.py
|---other#其他相关文件
|-templates#开发应所需模板,主要用于admin中的,前端的请在根目路下的主题中调用
|--admin#admin模板路径
|-static
|-dependencies.txt 须加入installed_app的依赖声明,一行一个,只写引导的名字即可
|-requirements.txt 第三方依赖包,名称 == 版本号 

apps.py

一定要加入ready部分,这样才可以将这里的app的urls注册到系统中

from django.apps import AppConfig
from apps.core.services.route_service import register_app_urls


class SoftwareConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'user_space.apps.appname'
    verbose_name = 'app管理'

    def ready(self):

        # 自动注册路由
        register_app_urls(
            prefix="appname",  # URL前缀
            app_name=self.name  # 应用命名空间
        )

urls.py

# user_space/apps/software/urls.py
from django.urls import path



app_name = "appname"
urlpatterns = [

    #路径写法和正常一样
    # path('list/', views, name='list'),

]

 

这样在系统启动时,会将uses_space中的应用一起注册到系统中