Django 入门 — 全栈框架初体验
🕐 预计用时:2-3 小时 | 🎯 目标:掌握 Django 项目创建、MVT 架构、路由配置和 Admin 后台
📖 今日目录
1. Django vs Flask
🏢 两大框架对比
💡 Flask 像瑞士军刀,Django 像全功能工具箱:Flask 给你一把刀,你自己组装工具。Django 给你一整箱工具,开箱即用,但箱子本身有重量。两者都是顶级框架,学会任何一个都能找到好工作。两个都学?那就是"双刀流"!
2. 安装 Django
# 安装pip install django# 验证python -m django --version# 输出:5.1 或类似版本号
3. 创建项目
📁 创建 Django 项目
# 创建一个名为 mysite 的项目django-admin startproject mysite# 查看生成的文件# mysite/# ├── manage.py ← 管理工具(运行服务器、迁移等)# └── mysite/# ├── __init__.py# ├── settings.py ← 项目配置# ├── urls.py ← 根路由# ├── asgi.py ← ASGI 入口# └── wsgi.py ← WSGI 入口
🚀 启动开发服务器
# 进入项目目录cd mysite# 启动服务器python manage.py runserver# 输出:# Starting development server at http://127.0.0.1:8000/# 指定端口python manage.py runserver 8080# 指定 IP 和端口(局域网可访问)python manage.py runserver 0.0.0.0:8000
📦 创建应用(App)
# Django 项目由多个"应用"组成# 比如博客项目:users 应用 + posts 应用 + comments 应用python manage.py startapp blog# 生成的文件:# blog/# ├── __init__.py# ├── admin.py ← Admin 后台配置# ├── apps.py ← 应用配置# ├── models.py ← 数据模型# ├── tests.py ← 测试# └── views.py ← 视图函数
💡 项目(Project) vs 应用(App):• 项目 = 整个网站(mysite)• 应用 = 网站中的一个功能模块(blog、users、shop)类比:项目 = 公司,应用 = 部门。一个公司有多个部门,每个部门负责不同的业务。
4. MVT 架构
Django 使用 MVT(Model-View-Template) 架构,和 Flask 的自由风格不同——Django 有明确的文件组织规范。
# 请求流程:# 用户请求 → urls.py(路由) → views.py(视图) → models.py(数据) → templates(模板) → 响应# 对比 Flask 和 Django:# Flask: @app.route → 视图函数 → render_template# Django: urls.py → views.py → render()
📋 MVT 三件套
5. 路由配置
🗺️ Django 路由系统
和 Flask 的装饰器不同,Django 用 urls.py 文件集中管理路由。
# mysite/urls.py(根路由)from django.contrib import adminfrom django.urls import path, includefrom blog import viewsurlpatterns = [ path('admin/', admin.site.urls), # Admin 后台 path('', views.index, name='index'), # 首页 path('blog/', include('blog.urls')), # 包含 blog 应用的路由]
# blog/urls.py(应用路由)from django.urls import pathfrom . import viewsapp_name = 'blog' # 命名空间(避免路由名冲突)urlpatterns = [ path('', views.post_list, name='post_list'), # /blog/ path('<int:pk>/', views.post_detail, name='post_detail'), # /blog/42/ path('create/', views.post_create, name='post_create'), # /blog/create/ path('<int:pk>/edit/', views.post_edit, name='post_edit'),# /blog/42/edit/]
📌 URL 参数
# Flask 风格(装饰器)# @app.route('/blog/<int:post_id>')# Django 风格(path 函数)# path('<int:pk>/', views.post_detail)# 参数类型对照# <int:pk> → 整数参数(Flask: <int:pk>)# <str:name> → 字符串参数(Flask: <name>)# <slug:slug> → URL 友好字符串(如 "hello-world")# <uuid:id> → UUID 参数
6. 视图函数
👁️ 函数视图(FBV)
# blog/views.pyfrom django.shortcuts import render, get_object_or_404, redirectfrom django.http import JsonResponse, HttpResponsefrom .models import Post# 最简单的视图def index(request): return HttpResponse('<h1>Hello, Django!</h1>')# 带模板的视图def post_list(request): posts = Post.objects.all().order_by('-created_at') return render(request, 'blog/post_list.html', {'posts': posts})# 带参数的视图def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) return render(request, 'blog/post_detail.html', {'post': post})# JSON 响应def api_posts(request): posts = list(Post.objects.values('id', 'title', 'created_at')) return JsonResponse({'data': posts})
📋 Django 视图 vs Flask 视图
| | |
|---|
| render_template('x.html') | render(request, 'x.html') |
| jsonify({...}) | JsonResponse({...}) |
| redirect(url_for('x')) | redirect('url_name') |
| abort(404) | raise Http404 |
| request.args.get('q') | request.GET.get('q') |
| request.form['name'] | request.POST['name'] |
7. 模板系统
🎨 Django Template Language(DTL)
<!-- templates/blog/post_list.html -->{% extends "base.html" %}{% block title %}文章列表{% endblock %}{% block content %}<h1>📝 最新文章</h1>{% for post in posts %}<article> <h2><a href="{% url 'blog:post_detail' post.pk %}">{{ post.title }}</a></h2> <p class="meta"> {{ post.author.username }} · {{ post.created_at|date:"Y-m-d" }} </p> <p>{{ post.summary }}</p></article>{% empty %} <p>暂无文章。</p>{% endfor %}{% endblock %}
📝 DTL vs Jinja2 对比
| | |
|---|
| {{ var }} | {{ var }} |
| {% for %} | {% for %} |
| url_for('route') | {% url 'name' %} |
| {{ var | upper }} | {{ var|upper }} |
| {% extends %} | {% extends %} |
| {% block %} | {% block %} |
| url_for('static') | {% static 'path' %} |
8. Admin 管理后台
🎛️ Django Admin 的魔力
Django 最令人惊叹的功能——自动生成的管理后台。只需要注册模型,就能得到一个功能完整的 Web 管理界面。
# 第一步:创建管理员账号python manage.py createsuperuser# 输入用户名、邮箱、密码# 第二步:在 admin.py 中注册模型# blog/admin.pyfrom django.contrib import adminfrom .models import Post, Category, Comment@admin.register(Post)class PostAdmin(admin.ModelAdmin): list_display = ['title', 'author', 'category', 'views', 'created_at'] list_filter = ['category', 'created_at', 'author'] search_fields = ['title', 'content'] date_hierarchy = 'created_at' ordering = ['-created_at']@admin.register(Category)class CategoryAdmin(admin.ModelAdmin): list_display = ['name', 'post_count']@admin.register(Comment)class CommentAdmin(admin.ModelAdmin): list_display = ['post', 'author', 'created_at'] list_filter = ['created_at']
# 访问 http://127.0.0.1:8000/admin/# 用刚才创建的 superuser 账号登录# 你会看到一个完整的管理后台:# - 文章管理(增删改查、搜索、筛选、排序)# - 分类管理# - 评论管理# - 用户管理
🎉 Admin 后台 = 免费的 CMS!• 自动根据 models.py 生成表单• 支持搜索、筛选、排序、分页• 支持批量操作(批量删除、批量发布)• 可自定义显示字段、过滤条件• 权限控制(staff/superuser 区分)很多小团队直接用 Django Admin 当内容管理系统,省去自己写后台的工作量!
9. 今日练习
🏋️ 练习 1:创建博客项目
# 1. 用 startproject 创建 mysite 项目# 2. 用 startapp 创建 blog 应用# 3. 定义 Post 模型(title, content, created_at)# 4. 配置路由:首页显示文章列表# 5. 创建模板渲染文章列表
🏋️ 练习 2:Admin 后台
# 1. 创建 superuser# 2. 在 admin.py 注册 Post 模型# 3. 自定义 list_display(显示标题、作者、时间)# 4. 添加搜索和筛选功能# 5. 在 Admin 中添加 3 篇文章
🏋️ 练习 3:文章详情页
# 1. 定义路由 /blog/<int:pk>/# 2. 编写 post_detail 视图# 3. 创建 detail.html 模板# 4. 在列表页添加链接跳转到详情页
10. 今日小结
| |
|---|
| 全栈框架,自带 ORM/Admin/Auth/Template |
| startproject(项目)+ startapp(应用) |
| Model 数据模型 → View 视图 → Template 模板 |
| urls.py + path() + include() + 命名空间 |
| render(request, template, context) / get_object_or_404 |
| {% extends %} / {% block %} / {% url %} / {% static %} |
| 注册模型 → 自动生成管理后台,零代码实现 CRUD |
🚀 明日预告:Day 60 — Django 模型层今天我们搭建了 Django 项目的骨架,明天深入模型层——字段类型、关系定义、QuerySet 查询 API、数据库迁移。Django 的 ORM 是 Python 世界最强大的 ORM 之一,掌握它让你的数据操作效率翻倍!