前言

在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技能!

小夜