杰瑞科技汇

Django教程怎么学?零基础入门到实战路径?

Django 完整入门教程:从零开始构建你的第一个博客

目录

  1. 什么是 Django?
  2. 为什么选择 Django?
  3. 环境准备
  4. 第一步:创建项目和第一个应用
  5. 第二步:定义数据模型
  6. 第三步:创建和管理后台
  7. 第四步:配置 URL 和视图
  8. 第五步:创建模板
  9. 第六步:处理表单和用户交互
  10. 第七步:部署上线(可选)
  11. 总结与进阶

什么是 Django?

Django 是一个用 Python 编写的高级 Web 框架,它遵循“不要重复自己”(Don't Repeat Yourself, DRY)的原则,旨在帮助开发者快速、安全地构建复杂的数据库驱动的网站。

Django教程怎么学?零基础入门到实战路径?-图1
(图片来源网络,侵删)

你可以把 Django 想象成一个“汽车车身底盘”,它已经为你准备好了发动机、变速箱、底盘、悬挂等核心部件(用户认证、后台管理、ORM、路由系统等),你只需要专注于设计和安装你自己的车身和内饰(即你的业务逻辑和页面),就能快速造出一辆可用的汽车。

为什么选择 Django?

  • 快速开发:Django 提供了大量的开箱即用的功能,让你能专注于业务逻辑,而不是重复造轮子。
  • “自带电池”:框架自带了许多 Web 开发中常见的需求,如:
    • 强大的后台管理:几行代码就能自动生成一个功能齐全的后台。
    • ORM (Object-Relational Mapper):用 Python 类来操作数据库,无需编写复杂的 SQL 语句。
    • 用户认证系统:处理用户注册、登录、注销等。
    • 安全性:默认防止常见的 Web 攻击,如 CSRF、XSS、SQL 注入等。
    • URL 路由:优雅地将 URL 映射到视图函数。
  • 可扩展性:从一个小型博客到像 Instagram、Pinterest 这样的大型网站,Django 都能轻松应对。
  • 庞大的社区:遇到问题时,你很容易在 Stack Overflow、GitHub 等社区找到帮助。

环境准备

在开始之前,请确保你的电脑上已经安装了 Python 和 pip,你可以在终端(或命令提示符)中运行以下命令来检查:

python --version
pip --version

强烈建议:为每个项目创建一个独立的虚拟环境,以避免不同项目之间的包版本冲突。

  1. 创建并激活虚拟环境

    Django教程怎么学?零基础入门到实战路径?-图2
    (图片来源网络,侵删)
    • macOS / Linux:

      # 创建一个名为 myblog 的虚拟环境
      python3 -m venv myblog
      # 激活虚拟环境
      source myblog/bin/activate
    • Windows:

      # 创建一个名为 myblog 的虚拟环境
      python -m venv myblog
      # 激活虚拟环境
      .\myblog\Scripts\activate

      激活后,你的终端提示符前面会出现 (myblog),表示虚拟环境已生效。

  2. 安装 Django 在激活的虚拟环境中,使用 pip 安装 Django:

    Django教程怎么学?零基础入门到实战路径?-图3
    (图片来源网络,侵删)
    pip install django

第一步:创建项目和第一个应用

Django 项目由多个“应用”(App)组成,一个应用是一个专门用于处理某项功能的 Web 模块,比如博客、商店、论坛等。

  1. 创建项目 我们使用 django-admin 命令来创建一个名为 myblog_project 的项目。

    django-admin startproject myblog_project

    这会创建一个 myblog_project 文件夹,里面包含了项目的核心配置文件。

  2. 进入项目目录

    cd myblog_project
  3. 创建应用 现在我们来创建一个博客应用,我们称之为 blog

    python manage.py startapp blog

    你会看到多了一个 blog 文件夹,这就是我们的应用。

  4. 注册应用 Django 需要知道要加载哪些应用,打开 myblog_project/settings.py 文件,找到 INSTALLED_APPS 列表,将我们的 blog 应用添加进去:

    # myblog_project/settings.py
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'blog',  # 添加这一行
    ]
  5. 运行开发服务器 让我们启动一下开发服务器,看看一切是否正常。

    python manage.py runserver

    在浏览器中访问 http://127.0.0.1:8000/,你应该能看到 Django 的欢迎页面。


第二步:定义数据模型

模型是数据的唯一、权威的信息来源,它包含了你的数据字段的定义和行为,我们将为博客创建两个模型:Post(文章)和 Category(分类)。

  1. 编辑 blog/models.py 打开 blog 应用下的 models.py 文件,添加以下代码:

    # blog/models.py
    from django.db import models
    from django.contrib.auth.models import User
    class Category(models.Model):
        name = models.CharField(max_length=100)
        def __str__(self):
            return self.name
    class Post(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
        category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='posts')
        def __str__(self):
            return self.title
    • __str__(self):定义了对象的字符串表示形式,方便在后台识别。
    • ForeignKey:定义了一个多对一的关系,一篇文章只能有一个作者,但一个作者可以有多篇文章。
    • on_delete=models.CASCADE:当关联的作者被删除时,该文章也会被删除。
    • related_name:允许我们通过反向关系查询,user.blog_posts.all()
  2. 创建和应用数据库迁移 Django 通过“迁移”来同步你的模型定义到数据库。

    • 生成迁移文件:

      python manage.py makemigrations

      你会看到 Django 为我们创建了一个新的迁移文件。

    • 应用迁移,创建数据库表:

      python manage.py migrate

      你的数据库中已经生成了 blog_postblog_category 等表。


第三步:创建和管理后台

Django 最强大的功能之一就是其自动生成的后台管理界面,我们可以用它来管理文章和分类。

  1. 创建超级用户 为了登录后台,我们需要一个管理员账户。

    python manage.py createsuperuser

    按照提示输入用户名、邮箱和密码。

  2. 注册模型到后台 打开 blog/admin.py 文件,将我们的模型注册进去:

    # blog/admin.py
    from django.contrib import admin
    from .models import Post, Category
    admin.site.register(Category)
    admin.site.register(Post)
  3. 测试后台

    • 确保开发服务器正在运行 (python manage.py runserver)。
    • 在浏览器中访问 http://127.0.0.1:8000/admin/
    • 使用你刚刚创建的超级用户名和密码登录。
    • 你现在可以看到 "Posts" 和 "Categories" 选项,点击 "Add" 来添加一些分类和文章,测试一下!

第四步:配置 URL 和视图

URL 是网站的地址,视图是处理请求并返回响应的函数,我们将配置 URL 路由,并创建视图来显示文章列表和详情页。

  1. 创建视图函数 编辑 blog/views.py 文件:

    # blog/views.py
    from django.shortcuts import render, get_object_or_404
    from .models import Post, Category
    def post_list(request):
        posts = Post.objects.all().order_by('-created_at')
        categories = Category.objects.all()
        context = {
            'posts': posts,
            'categories': categories,
        }
        return render(request, 'blog/post_list.html', context)
    def post_detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
        categories = Category.objects.all()
        context = {
            'post': post,
            'categories': categories,
        }
        return render(request, 'blog/post_detail.html', context)
    • render:一个快捷函数,用于加载模板并返回一个 HttpResponse 对象。
    • get_object_or_404:如果对象不存在,返回 404 错误页面,非常方便。
  2. 配置应用的 URLblog 应用目录下,创建一个名为 urls.py 的新文件:

    # blog/urls.py
    from django.urls import path
    from . import views
    urlpatterns = [
        path('', views.post_list, name='post_list'),
        path('post/<int:pk>/', views.post_detail, name='post_detail'),
    ]
    • path('', ...):空路径,对应网站的首页,会调用 post_list 视图。
    • path('post/<int:pk>/', ...):匹配类似 /post/1/ 这样的 URL,<int:pk> 会捕获一个整数作为文章的主键,并传递给 post_detail 视图。
  3. 配置项目的 URL 我们需要告诉主项目 myblog_project 如何处理 URL 请求,打开 myblog_project/urls.py 文件,修改如下:

    # myblog_project/urls.py
    from django.contrib import admin
    from django.urls import path, include # 导入 include
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('blog.urls')), # 添加这一行,将根路径下的请求交给 blog.urls 处理
    ]
    • include('blog.urls'):将所有以 开头的请求,都转发到 blog 应用的 urls.py 文件中进行进一步匹配。

现在访问 http://127.0.0.1:8000/,你会看到一个 TemplateDoesNotExist 错误,因为我们还没有创建模板。


第五步:创建模板

模板是包含 HTML 代码和 Django 模板语言的文件,用于动态生成页面。

  1. 创建模板目录结构blog 应用目录下,创建 templates/blog/ 文件夹,Django 会自动在这个路径下查找模板。

    • blog/
      • templates/
        • blog/
          • post_list.html
          • post_detail.html
  2. 创建 post_list.html 编辑 blog/templates/blog/post_list.html 文件:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>我的博客</title>
        <style>
            body { font-family: sans-serif; margin: 40px; }
            .post { border: 1px solid #ccc; padding: 10px; margin-bottom: 20px; border-radius: 5px; }
            .post h2 { margin-top: 0; }
            .post a { text-decoration: none; color: #007bff; }
        </style>
    </head>
    <body>
        <h1>我的博客</h1>
        <h2>分类</h2>
        <ul>
            {% for category in categories %}
                <li><a href="#">{{ category.name }}</a></li>
            {% endfor %}
        </ul>
        <hr>
        <h2>所有文章</h2>
        {% for post in posts %}
            <div class="post">
                <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
                <p>作者: {{ post.author.username }}</p>
                <p>发布时间: {{ post.created_at|date:"Y-m-d H:i" }}</p>
                <p>{{ post.content|truncatewords:30 }}</p>
            </div>
        {% empty %}
            <p>暂无文章。</p>
        {% endfor %}
    </body>
    </html>
    • {% for ... %}:循环标签。
    • {{ variable }}:变量标签。
    • {% url 'post_detail' pk=post.pk %}:使用 name='post_detail' 的 URL,并动态传递 pk 参数,这是 Django 的最佳实践。
  3. 创建 post_detail.html 编辑 blog/templates/blog/post_detail.html 文件:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>{{ post.title }}</title>
        <style>
            body { font-family: sans-serif; margin: 40px; }
            .post { max-width: 800px; margin: auto; }
            .post h1 { color: #333; }
            .post-meta { color: #777; font-size: 0.9em; }
        </style>
    </head>
    <body>
        <div class="post">
            <h1>{{ post.title }}</h1>
            <p class="post-meta">作者: {{ post.author.username }} | 发布时间: {{ post.created_at|date:"Y-m-d H:i" }}</p>
            <hr>
            <p>{{ post.content }}</p>
        </div>
        <a href="{% url 'post_list' %}">返回首页</a>
    </body>
    </html>

现在刷新你的浏览器,你应该能看到一个漂亮的博客首页,并且可以点击文章标题进入详情页了!


第六步:处理表单和用户交互

让我们添加一个功能:允许登录的用户发表评论。

  1. 创建评论模型 编辑 blog/models.py,添加 Comment 模型:

    # blog/models.py
    # ... (保留之前的代码)
    from django.utils import timezone
    class Comment(models.Model):
        post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        body = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)
        def __str__(self):
            return f'Comment by {self.author} on {self.post}'
  2. 重新生成并应用迁移

    python manage.py makemigrations
    python manage.py migrate
  3. 注册评论模型到后台 编辑 blog/admin.py

    # blog/admin.py
    # ... (保留之前的代码)
    from .models import Post, Category, Comment
    admin.site.register(Category)
    admin.site.register(Post)
    admin.site.register(Comment) # 添加这一行
  4. 更新详情页模板以显示评论 编辑 blog/templates/blog/post_detail.html,在文章内容下方添加:

    <!-- ... 在文章内容 <p>{{ post.content }}</p> 后面添加 ... -->
    <hr>
    <h3>评论 ({{ post.comments.count }})</h3>
    {% for comment in post.comments.all %}
        <div style="border: 1px solid #eee; padding: 10px; margin-bottom: 10px; border-radius: 5px;">
            <p><strong>{{ comment.author.username }}</strong> ({{ comment.created_at|date:"Y-m-d H:i" }})</p>
            <p>{{ comment.body }}</p>
        </div>
    {% empty %}
        <p>暂无评论。</p>
    {% endfor %}
    <!-- ... 在返回首页链接前添加评论表单 ... -->
    <hr>
    <h3>发表评论</h3>
    <form action="{% url 'post_detail' pk=post.pk %}" method="post">
        {% csrf_token %}
        {{ comment_form.as_p }}
        <button type="submit">提交评论</button>
    </form>
    • {% csrf_token %}:Django 的跨站请求伪造保护,非常重要!
  5. 创建视图来处理评论 编辑 blog/views.py

    # blog/views.py
    from django.shortcuts import render, get_object_or_404, redirect
    from .models import Post, Category, Comment
    from .forms import CommentForm # 我们马上会创建这个表单
    # ... (保留 post_list 和 post_detail 函数)
    def post_detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
        categories = Category.objects.all()
        # 处理评论表单
        if request.method == 'POST':
            comment_form = CommentForm(data=request.POST)
            if comment_form.is_valid():
                new_comment = comment_form.save(commit=False)
                new_comment.post = post
                new_comment.author = request.user
                new_comment.save()
                return redirect('post_detail', pk=post.pk)
        else:
            comment_form = CommentForm()
        context = {
            'post': post,
            'categories': categories,
            'comment_form': comment_form, # 将表单添加到上下文
        }
        return render(request, 'blog/post_detail.html', context)
  6. 创建评论表单blog 应用目录下创建一个 forms.py 文件:

    # blog/forms.py
    from django import forms
    from .models import Comment
    class CommentForm(forms.ModelForm):
        class Meta:
            model = Comment
            fields = ('body',)

    Django Forms 可以根据模型自动生成表单字段,非常方便。

  7. 更新详情页模板以正确使用表单 修改 blog/templates/blog/post_detail.html 中的表单部分:

    <!-- ... 修改评论表单部分 ... -->
    <h3>发表评论</h3>
    <form method="post">
        {% csrf_token %}
        {{ comment_form.body }}
        <button type="submit">提交评论</button>
    </form>
    • 我们直接使用 {{ comment_form.body }} 来渲染评论内容输入框,你也可以使用 {{ comment_form.as_p }} 来渲染所有字段。

你可以登录一个普通用户(或者用超级用户),在文章详情页发表评论了!


第七步:部署上线(可选)

当你的应用开发完成后,你可能希望将其部署到公共服务器上,让任何人都能访问,这是一个复杂的话题,但基本流程如下:

  1. 选择一个云服务器:如 Heroku, PythonAnywhere, DigitalOcean, AWS 等。
  2. 环境配置:在服务器上安装 Python 和你的项目依赖(pip freeze > requirements.txt)。
  3. 数据库迁移:在服务器上运行 python manage.py migrate
  4. 静态文件处理:使用 python manage.py collectstatic 将所有静态文件(CSS, JS, 图片)收集到一个地方。
  5. 使用 WSGI 服务器:如 Gunicorn 或 uWSGI,来运行你的 Django 应用。
  6. 使用反向代理:如 Nginx,来处理静态文件请求并将动态请求转发给 WSGI 服务器。

这个过程有大量细节,建议在熟悉 Django 基础后,再专门学习部署相关的教程。


总结与进阶

恭喜你!你已经成功使用 Django 从零开始构建了一个功能完整的博客应用,你学会了:

  • 如何创建项目和应用。
  • 如何定义和使用数据模型。
  • 如何利用 Django 后台管理数据。
  • 如何配置 URL、编写视图和创建模板。
  • 如何处理表单和用户交互。

接下来可以学习什么?

  • 用户认证系统:集成 Django 内置的用户注册、登录、注销、密码修改等功能。
  • 表单进阶:创建更复杂的自定义表单,进行数据验证。
  • 类视图:学习 Django 的基于类的视图,它们能让你的代码更简洁、可重用。
  • REST Framework:学习如何使用 Django REST framework 构建强大的 API。
  • 测试:为你的应用编写单元测试和集成测试,确保代码质量。
  • 缓存:使用缓存来提高网站性能。

Django 的世界非常广阔,希望这份教程能为你打开一扇门,祝你编码愉快!

分享:
扫描分享到社交APP
上一篇
下一篇