一、PDM + Django 搭建项目👇
🎯 核心目标
用 PDM (更现代的 Python 包管理工具),快速创建并管理 Django 项目(Web 框架),让开发流程更丝滑✨
🧩 分步拆解
1. 创建项目
用 PDM 初始化环境 + 安装 Django + 创建 Django 项目结构
pip install pdm:先装 PDM 包管理工具 🛠️pdm init:初始化 PDM 项目,生成pyproject.toml(项目配置文件) 🔧pdm add django:用 PDM 装 Django 依赖 📦pdm run django-admin startproject Tesla ./:通过 PDM 执行命令,创建 Django 项目(命名Tesla) 🏗️
2. 启动 Django 服务
项目创建好后,用 manage.py 启动开发服务器
python manage.py runserver:启动 Django 本地服务 🚀- 输出里的
http://127.0.0.1:8000/就是访问地址啦~ 浏览器打开就能看项目前台 🌐 - 提示
18 unapplied migrations?别慌!这是 Django 内置表还没创建,后面用migrate命令解决 🐛
3. 项目结构梳理
从 "新建目录→虚拟环境→配置文件→Django 核心文件" 一步步搭架子
- PyCharm 项目:新建文件夹 + 虚拟环境(隔离项目依赖) 🌿
- PDM 项目 :生成
pyproject.toml(记录依赖、脚本等配置) 📄 - Django 项目 :创建同名包(如
Tesla文件夹) +manage.py(Django 命令入口) ⚙️
4. 自定义管理命令
用 PDM 的 scripts 配置,把常用 Django 命令 "封装" 成快捷指令,不用每次敲长命令啦~
toml
[tool.pdm.scripts]
init = { composite = [
"makeM",
"M",
"createadmin",
]}
makeM = 'python manage.py makemigrations'
M = 'python manage.py migrate'
R = 'python manage.py runserver' # --noreload
T = 'python manage.py test'
createadmin = '''python manage.py shell -c "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'adminpass')"'''
- 在
pyproject.toml里加[tool.pdm.scripts]:init:组合多个命令(makemigrations做迁移文件、migrate执行迁移、createsuperuser建管理员) 🔄makeM/M/createadmin:分别对应单个 Django 命令(生成迁移、执行迁移、创建超级用户) 🛠️- 效果:以后敲
pdm run init,就能一键执行多个操作,超方便! 🚀
5. 快捷命令 & 项目预览
- PDM 快捷指令 :
pdm run init:一键初始化(建表 + 超级用户) 🔧pdm run R:启动 Django 服务(替代python manage.py runserver) 🚀pdm run T:执行 Django 测试(python manage.py test) 🧪
- 项目访问 :
- 前台:
http://127.0.0.1:8000/(Django 默认首页) 🌐 - 后台:
http://127.0.0.1:8000/admin/(管理员入口) 🔐 - 默认账号:
admin/adminpass👑
- 前台:
💻 创建 App
bash
bash
python manage.py startapp yifei
- 作用 :用 Django 内置命令
startapp,创建一个名为 yifei 的 App 文件夹及基础结构 🏗️ - 生成的文件 :会在项目里新增 yifei
/目录,包含models.py(写数据库模型)、views.py(写视图逻辑)、apps.py(App 配置)等文件,这些是开发功能模块的基础文件~
注册 App(为啥要设置)
"在项目的设置中,把 yifei 加载到安装列表" → 要修改 Django 项目的 settings.py 文件:
XML
INSTALLED_APPS = [
# 其他已有的 App...
'yifei', # 把这行加上,告诉 Django 识别并启用这个 App
]
- 作用 :Django 项目像一个 "大容器",
INSTALLED_APPS是 "已安装 App 清单" 📜 - 必须注册的原因:只有加到这里,Django 才会加载 yifei 里的模型、路由、静态文件等,比如执行数据库迁移、访问 App 里的视图,都得先注册!
二、视图和路由
视图是干啥的?👉 网站的 "小管家"
视图(View)就像你点外卖时,商家接到订单、准备餐品、再送餐的过程~
- 👉 接收请求 :用户用浏览器访问网址(比如
http://xxx/help),这就是给 Django 发了个 HTTP 请求,视图会 "接住" 这个请求 👐 - 👉 处理并生成响应 :视图收到请求后,会处理逻辑(比如拼一个
hello world内容),然后返回 HTTP 响应(把内容给用户看),就像商家做好餐、打包好给你送过来~
python
# 1. 定义视图函数:def 是"定义函数"的关键字,help 是函数名(你取的),request 是"请求对象"(装着用户的访问信息)
def help(request):
# 2. 准备响应内容:拼一个简单的字符串,相当于准备要给用户的"餐品"
html = "hello world"
# 3. 返回响应:用 HttpResponse 把内容包起来,送给用户! HttpResponse 是 Django 帮我们生成响应的工具~
return HttpResponse(html)
request:用户的 "订单" 信息都在这儿(比如访问时间、带的参数等)📦HttpResponse:把内容变成 "能送出去的外卖",让浏览器能显示出来 🚀
把 Django 项目想成一家 "网站餐厅" 🍴:
- 👉 用户访问网址 = 点外卖(发请求)
- 👉 视图函数 = 后厨 "做菜的厨师"👨🍳:接到订单(
request)→ 做内容(html = "hello world")→ 打包好(HttpResponse)→ 给用户送餐(返回响应) - 👉 最后用户浏览器显示
hello world= 收到外卖,开心开吃~
路由的作用
路由(URL 配置)就是 "网址和视图的连接器" 🔗:
- 用户访问
http://xxx/hello123→ 路由匹配到hello123→ 找到对应的视图函数(比如hello)→ 执行函数返回内容给用户
简单说:路由决定了 "访问哪个网址,执行哪个视图" ,是 Django 里 "网址导航" 的关键~
项目主路由(Tesla/urls.py)
项目的 urls.py 是 总入口 ,负责把 App 的路由 "包含" 进来:
python
from django.contrib import admin
from django.urls import path, include # include 用来"包含"其他 App 的路由
urlpatterns = [
path("admin/", admin.site.urls), # 后台管理的路由(默认自带)
# 重点在这行!空字符串 '' 表示"根路径下的子路由交给 yifei.urls 处理"
path('', include("yifei.urls"))
]
path('', include("yifei.urls")):意思是 "只要访问的网址是根路径下的(比如http://xxx/xxx),就去 yifei 这个 App 的urls.py里找具体的路由规则" 🌳
2. 图 2:App 级路由(yifei/urls.py)
每个 App 可以有自己的 urls.py ,负责配置 当前 App 内部的 URL 和视图的对应关系 :
python
from django.urls import path
# 从当前 App 的 views.py 导入视图函数 hello(假设你在 yifei/views.py 里写了 hello 函数)
from .views import hello
urlpatterns = [
# 配置:访问 'hello123' 这个路径时,执行 hello 视图函数
path('hello123', hello),
]
path('hello123', hello):当用户访问http://xxx/hello123→ 触发hello视图函数 → 返回内容 🌍
3. 图 3:路由的总结 + 重启服务
- 创建路由 :就是写好 App 内的
urls.py,配置 URL 和视图的对应关系(如path('hello123', hello)) - 重启程序 :因为修改了路由配置,需要重启 Django 服务让改动生效~
- 用 PDM 的话,执行pdm run R (对应
python manage.py runserver)重启服务 🚀
- 用 PDM 的话,执行pdm run R (对应
完整流程梳理(超清晰版)
- 用户访问网址 :比如
http://127.0.0.1:8000/hello123 - 项目主路由匹配 :
Tesla/urls.py里的path('', include("yifei.urls"))→ 发现是空路径,交给 yifei.urls处理 - App 路由匹配 :yifei
/urls.py里的path('hello123', hello)→ 匹配到hello123,执行hello视图函数 - 视图返回内容 :
hello函数处理逻辑(比如返回hello world)→ 内容返回给用户浏览器
举个🌰(用户访问流程)
假设项目启动后,本地地址是 http://127.0.0.1:8000 :
- 用户在浏览器输入
http://127.0.0.1:8000/hello123 - 路由依次匹配:主路由 → App 路由 → 找到
hello视图 → 执行函数 → 用户看到hello视图返回的内容~
为啥要分 "项目路由" 和 "App 路由"?
- 解耦:每个 App 自己管自己的路由,项目主路由只负责 "分配任务",代码更清晰 ✨
- 可扩展 :比如再加一个
blogApp ,只需要在主路由里加path('blog/', include('blog.urls')),让blog自己管理内部路由即可~
这样拆分后,整个路由系统就像 "大树的枝干" :主路由是树干,App 路由是树枝,每个树枝上的叶子是具体的视图~ 😊