前言

在Web开发中,用Python快速搭建一个博客系统是很多初学者的目标。Django作为“电池内置”的Python Web框架,提供了ORM(对象关系映射)和模板引擎等核心组件,能帮我们大幅简化开发流程。本文将用最简单的步骤,带你从零开始用Django实现一个能显示文章列表的博客系统,重点理解Django的核心思想——ORM操作数据,模板渲染页面

第一步:环境准备与项目初始化

要开始开发,首先需要安装Django并创建项目结构。

1. 安装Django

打开终端(命令提示符),运行以下命令安装最新版Django:

pip install django

验证安装是否成功:

django-admin --version  # 输出版本号,如3.2.20

2. 创建Django项目和应用

Django项目是一个完整的Web应用容器,应用(App)是项目的功能模块。
- 创建项目:

  django-admin startproject myblog  # 项目名为myblog
  cd myblog  # 进入项目目录
  • 创建应用:
  python manage.py startapp blog  # 创建名为blog的应用

此时项目结构如下(关键文件):

myblog/
├── myblog/          # 项目配置目录
│   ├── __init__.py
│   ├── settings.py  # 项目全局设置(如数据库、应用列表)
│   ├── urls.py      # 项目路由配置
│   └── wsgi.py
├── blog/            # 博客应用目录
│   ├── __init__.py
│   ├── models.py    # 数据模型定义(ORM核心)
│   ├── views.py     # 视图函数(处理请求)
│   └── urls.py      # 应用路由配置
└── manage.py        # Django命令行工具(创建迁移、启动服务等)

第二步:用ORM定义博客数据模型

ORM是Django的核心特性之一,它允许我们用Python类直接定义数据库表结构,无需手写SQL语句。这里我们需要为博客定义“文章”模型。

1. 定义数据模型

blog/models.py中,编写一个Post类表示文章表:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)  # 文章标题(字符串,限制长度200)
    content = models.TextField()              # 文章内容(长文本)
    pub_date = models.DateTimeField(auto_now_add=True)  # 发布时间(自动添加当前时间)

    def __str__(self):
        return self.title  # 后台显示文章标题
  • 解释
  • models.Model:Django模型的基类,自动关联数据库表。
  • CharField/TextField:对应数据库的字符串/长文本字段。
  • DateTimeField(auto_now_add=True):自动记录创建时间,无需手动设置。

2. 激活模型并创建数据库表

Django默认使用SQLite数据库(无需额外配置),只需将应用加入项目配置:
- 打开myblog/settings.py,在INSTALLED_APPS列表中添加'blog'

  INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'blog',  # 添加我们的博客应用
  ]
  • 创建数据库表(迁移数据):
  python manage.py makemigrations  # 生成迁移文件(将模型转为SQL)
  python manage.py migrate         # 执行迁移,创建表结构

此时,数据库中会生成一个blog_post表,存储文章数据。

第三步:编写视图和模板,展示博客内容

视图(View)处理用户请求并返回数据,模板(Template)负责将数据渲染为HTML页面。

1. 编写视图函数

blog/views.py中,定义一个视图函数,从数据库中获取所有文章并传递给模板:

from django.shortcuts import render
from .models import Post  # 导入刚才定义的Post模型

def index(request):
    # 获取所有文章,按发布时间降序排列
    posts = Post.objects.all().order_by('-pub_date')
    # 渲染模板,传递posts数据
    return render(request, 'blog/index.html', {'posts': posts})

2. 配置路由

Django通过路由(URL)将请求分发到视图。
- 先在blog/urls.py中定义应用内路由:

  from django.urls import path
  from . import views

  urlpatterns = [
      path('', views.index, name='index'),  # 根路径对应index视图
  ]
  • 再在项目路由myblog/urls.py中包含应用路由:
  from django.contrib import admin
  from django.urls import include, path

  urlpatterns = [
      path('admin/', admin.site.urls),
      path('', include('blog.urls')),  # 根路径路由到blog应用
  ]

3. 创建模板文件

模板负责将数据渲染为HTML页面。在blog应用下创建templates/blog目录,再新建index.html

<!DOCTYPE html>
<html>
<head>
    <title>我的博客</title>
    <style>
        body { font-family: Arial; max-width: 800px; margin: 0 auto; padding: 20px; }
        .post { border: 1px solid #ddd; padding: 10px; margin: 10px 0; border-radius: 5px; }
        h2 { color: #333; }
    </style>
</head>
<body>
    <h1>我的第一篇博客</h1>
    {% if posts %}  <!-- 模板语法:判断posts是否存在 -->
        {% for post in posts %}  <!-- 循环渲染每篇文章 -->
            <div class="post">
                <h2>{{ post.title }}</h2>  <!-- 显示标题 -->
                <p>发布时间:{{ post.pub_date|date:"Y-m-d H:i" }}</p>  <!-- 格式化日期 -->
                <p>{{ post.content }}</p>  <!-- 显示内容 -->
            </div>
        {% endfor %}
    {% else %}
        <p>暂无文章,快去发布第一篇吧!</p>
    {% endif %}
</body>
</html>
  • 模板语法
  • {{ post.title }}:输出变量(文章标题)。
  • {% for post in posts %}:循环遍历文章列表。
  • {{ post.pub_date|date:"Y-m-d H:i" }}:用过滤器格式化日期。

运行博客系统,查看效果

在终端执行:

python manage.py runserver

打开浏览器访问http://127.0.0.1:8000/,就能看到你的博客页面了!如果需要添加文章,可通过Django后台管理(后续可自行探索)。

总结

通过这3步,我们用Django实现了一个简单的博客系统,核心理解了:
1. ORM:用Python类定义数据库表,无需写SQL。
2. 模板引擎:通过HTML+模板语法动态渲染数据。
3. MVT架构:模型(Model)存数据,视图(View)处理逻辑,模板(Template)展示页面。

接下来可以尝试扩展功能,比如添加单篇文章详情页、用户登录、评论功能等,逐步提升Django技能!

小夜