DukeDuke
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
  • 技术文档

    • 网络原理

      • 交换机
      • 路由器
      • TCP/IP协议
      • HTTP 与 HTTPS
    • 软件架构

      • 什么是软件架构
      • 分层架构
      • 微服务架构
      • 事件驱动架构
      • 领域驱动设计(DDD)
      • 架构图
      • 高并发系统
    • Vue3

      • Vue3简介
      • Vue3响应式系统
      • Vue3组合式API
      • Vue3生命周期
      • Vue3模板语法
      • Vue3组件系统
      • Vue3 路由系统
      • Vue3 状态管理
      • Vue3 性能优化
      • Vue3 TypeScript 支持
      • Vue3 项目实战
      • VUE 面试题大全
      • Node.js 安装
    • JAVA

      • JVM

        • 认识JVM
        • JVM类加载器
        • 运行时数据区
        • 执行引擎
        • 本地方法接口
        • 本地方法库
        • JVM垃圾回收
        • JVM性能监控
        • JVM调优
      • 设计模式
        • 单例模式
        • 工厂模式
        • 策略模式
        • 适配器模式
        • 建造者模式
        • 原型模式
        • 装饰器模式
        • 代理模式
        • 外观模式
        • 享元模式
        • 组合模式
        • 桥接模式
      • Java多线程

        • Java 线程基础详解
        • Java 线程池详解
        • Java ThreadLocal 详解
        • Java volatile 详解
        • Java 线程间通信详解
        • Java 线程安全详解
        • Java 线程调度详解
        • Java 线程优先级详解

        • Java 线程中断详解
        • Java 线程死锁详解
      • Java反射
      • Java 面试题

        • Java 基础概念面试题
        • Java 面向对象编程面试题
        • Java 集合框架面试题
        • Java 多线程与并发面试题
        • JVM 与内存管理面试题
        • Java I/O 与 NIO 面试题
        • Java 异常处理面试题
        • Java 反射与注解面试题
        • Java Spring 框架面试题
        • Java 数据库与 JDBC 面试题
        • Java 性能优化面试题
        • Java 实际项目经验面试题
        • Java 高级特性面试题
        • Java 面试准备建议
    • Python

      • Python简介
      • Python安装
      • Python hello world
      • Python基础语法
      • Python数据类型
      • Python数字
      • Python字符串
      • Python列表
      • Python元组
      • Python字典
      • Python日期时间
      • Python文件操作
      • Python异常处理
      • Python函数
      • Python类
      • Python模块
      • Python包
      • Python多线程
      • Python面向对象
      • Python爬虫
      • Django web框架
      • Python 面试题

        • Python 面试题导航
        • Python 基础概念
        • Python 面向对象编程
        • Python 数据结构
        • Python 高级特性
        • Python 框架
        • Python 性能优化
        • Python 项目经验
    • Spring

      • Spring
      • Springboot
      • Spring Security 安全框架
      • SpringBoot 中的事件详解
      • SpringBoot 中的定时任务详解
      • SpringBoot 自动装配原理与源码解释
    • Mybatis

      • Mybatis
      • Mybatis-Plus
    • 数据库

      • Redis

        • Redis简介
        • Redis(单机)安装
        • Redis配置
        • Redis数据结构
        • RDB、AOF 和混合持久化机制
        • Redis内存管理
        • Redis缓存一致性
        • Redis缓存穿透
        • Redis缓存击穿
        • Redis缓存雪崩
        • Redis Lua脚本
        • Redis主从复制
        • Redis哨兵模式
        • Redis集群
        • Redis数据分片
        • Redis CPU使用率过高
        • Redis面试题
      • MySQL

        • MySQL简介
        • MySQL安装
        • MySQL配置
        • MYSQL日常维护
        • MYSQL优化-慢查询
        • MYSQL优化-索引
        • MYSQL数据库设计规范
    • 消息队列

      • RocketMQ
      • Kafka
      • RabbitMQ
      • 消息队列面试题
    • 微服务

      • SpringCloud 微服务
      • Eureka 注册中心
      • Nacos 注册中心
      • Gateway 网关
      • Feign 服务调用
      • Sentinel 限流 与 熔断
      • Seata 分布式事务
      • CAP 理论
      • Redis 分布式锁
      • 高并发系统设计
    • ELK日志分析系统

      • Elasticsearch 搜索引擎
      • Logstash 数据处理
      • Kibana 可视化
      • ELK 实战
    • 开放API

      • 开放API设计
      • 开放API示例项目
    • 人工智能

      • 人工智能简介
      • 机器学习

      • 深度学习

      • 自然语言处理

      • 计算机视觉

        • CUDA与cuDNN详细安装
        • Conda 安装
        • Pytorch 深度学习框架
        • yolo 目标检测
        • TensorRT 深度学习推理优化引擎
        • TensorFlow 机器学习
        • CVAT 图像标注
        • Windows 下安装 CUDA、cuDNN、TensorRT、TensorRT-YOLO 环境
        • Windows10+CUDA+cuDNN+TensorRT+TensorRT-YOLO 部署高性能YOLO11推理
    • 大数据

      • 大数据简介
      • Hadoop 数据存储
      • Flume 数据采集
      • Sqoop 数据导入导出
      • Hive 数据仓库
      • Spark 数据处理
      • Flink 数据处理
      • Kafka 数据采集
      • HBase 数据存储
      • Elasticsearch 搜索引擎
    • 图像处理

      • 图像处理简介
      • 医学图像web呈现
      • 医学图像处理
      • 切片细胞分离问题
    • 服务器&运维

      • Linux 系统

        • Linux 系统管理
        • Linux 网络管理
        • Linux 文件管理
        • Linux 命令大全
      • Nginx Web 服务器

        • Nginx 安装 与 配置
        • Nginx 负载均衡
        • Nginx SSL证书配置
        • Nginx Keepalived 高可用
      • Docker 容器

        • Docker 简介
        • Docker 安装与配置
        • Docker 命令
        • Docker 部署 Nginx
        • Docker 部署 MySQL
        • Docker 部署 Redis
      • 服务器

        • 塔式服务器
        • 机架式服务器
        • 刀片服务器
      • Git 版本控制
      • Jenkins 持续集成
      • Jmeter 性能测试
      • Let's Encrypt 免费SSL证书
    • 简历

      • 项目经理简历
      • 开发工程师简历

Django web 框架

什么是 Django?

Django 是一个用 Python 写的免费开源的 Web 框架,就像是一个现成的工具箱,帮你快速搭建网站。它遵循"快速开发,清晰实用"的设计理念,让你不用从零开始写所有代码。

为什么选择 Django?

  • 快速开发:Django 提供了很多现成的功能,比如用户认证、后台管理、数据库操作等
  • 安全可靠:内置了很多安全防护措施,帮你避免常见的 Web 安全问题
  • 功能丰富:自带 ORM(数据库操作工具)、模板系统、表单处理等
  • 文档完善:官方文档非常详细,社区活跃

安装 Django

首先确保你已经安装了 Python,然后运行以下命令:

pip install django

检查安装是否成功:

python -m django --version

创建第一个 Django 项目

1. 创建项目

django-admin startproject mywebsite
cd mywebsite

这会创建一个名为mywebsite的文件夹,里面包含项目的基本结构。

2. 项目结构说明

mywebsite/
├── manage.py          # 项目管理脚本
└── mywebsite/         # 项目配置文件夹
    ├── __init__.py
    ├── settings.py    # 项目设置
    ├── urls.py        # URL路由配置
    └── wsgi.py        # Web服务器接口

3. 运行开发服务器

python manage.py runserver

然后在浏览器中访问 http://127.0.0.1:8000/,你会看到 Django 的欢迎页面。

创建应用(App)

Django 项目由多个应用组成,每个应用负责特定的功能。

python manage.py startapp blog

应用结构

blog/
├── __init__.py
├── admin.py      # 后台管理配置
├── apps.py       # 应用配置
├── models.py     # 数据模型
├── tests.py      # 测试文件
└── views.py      # 视图函数

注册应用

在 mywebsite/settings.py 中的 INSTALLED_APPS 列表里添加你的应用:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',  # 添加这一行
]

创建数据模型

数据模型就是定义你的数据在数据库中如何存储。

示例:博客文章模型

在 blog/models.py 中:

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200, verbose_name='标题')
    content = models.TextField(verbose_name='内容')
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
    created_date = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    published_date = models.DateTimeField(blank=True, null=True, verbose_name='发布时间')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '博客文章'
        verbose_name_plural = '博客文章'

创建数据库迁移

python manage.py makemigrations
python manage.py migrate

创建视图

视图就是处理用户请求并返回响应的函数。

示例:显示博客文章列表

在 blog/views.py 中:

from django.shortcuts import render
from .models import Post

def post_list(request):
    """显示所有已发布的博客文章"""
    posts = Post.objects.filter(published_date__isnull=False).order_by('-published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    """显示单篇博客文章的详细内容"""
    post = Post.objects.get(pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

配置 URL 路由

项目级 URL 配置

在 mywebsite/urls.py 中:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),  # 包含blog应用的URL
]

应用级 URL 配置

创建 blog/urls.py:

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

创建模板

模板就是 HTML 文件,用来显示数据。

创建模板目录

blog/
└── templates/
    └── blog/
        ├── base.html
        ├── post_list.html
        └── post_detail.html

基础模板 (base.html)

<!DOCTYPE html>
<html>
  <head>
    <title>{% block title %}我的博客{% endblock %}</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style>
      body {
        font-family: Arial, sans-serif;
        margin: 0;
        padding: 20px;
      }
      .container {
        max-width: 800px;
        margin: 0 auto;
      }
      .post {
        border: 1px solid #ddd;
        padding: 15px;
        margin: 10px 0;
        border-radius: 5px;
      }
      .post h2 {
        color: #333;
        margin-top: 0;
      }
      .post-meta {
        color: #666;
        font-size: 0.9em;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <header>
        <h1><a href="{% url 'blog:post_list' %}">我的博客</a></h1>
      </header>

      <main>{% block content %} {% endblock %}</main>
    </div>
  </body>
</html>

文章列表模板 (post_list.html)

{% extends 'blog/base.html' %} {% block title %}博客文章列表{% endblock %} {%
block content %}
<h2>最新文章</h2>

{% if posts %} {% for post in posts %}
<article class="post">
  <h2>
    <a href="{% url 'blog:post_detail' pk=post.pk %}">{{ post.title }}</a>
  </h2>
  <div class="post-meta">
    作者: {{ post.author.username }} | 发布时间: {{
    post.published_date|date:"Y-m-d H:i" }}
  </div>
  <p>{{ post.content|truncatewords:30 }}</p>
</article>
{% endfor %} {% else %}
<p>暂无文章</p>
{% endif %} {% endblock %}

文章详情模板 (post_detail.html)

{% extends 'blog/base.html' %} {% block title %}{{ post.title }}{% endblock %}
{% block content %}
<article class="post">
  <h1>{{ post.title }}</h1>
  <div class="post-meta">
    作者: {{ post.author.username }} | 发布时间: {{
    post.published_date|date:"Y-m-d H:i" }}
  </div>
  <div class="post-content">{{ post.content|linebreaks }}</div>
</article>

<p><a href="{% url 'blog:post_list' %}">← 返回文章列表</a></p>
{% endblock %}

后台管理

Django 自带一个强大的后台管理系统。

创建超级用户

python manage.py createsuperuser

注册模型到后台

在 blog/admin.py 中:

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'created_date', 'published_date')
    list_filter = ('created_date', 'published_date', 'author')
    search_fields = ('title', 'content')
    date_hierarchy = 'created_date'
    ordering = ('-created_date',)

访问 http://127.0.0.1:8000/admin/ 就可以使用后台管理系统了。

完整案例:简单的博客系统

让我们创建一个完整的博客系统,包括创建、编辑、删除文章的功能。

1. 扩展模型

# blog/models.py
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

class Post(models.Model):
    title = models.CharField(max_length=200, verbose_name='标题')
    content = models.TextField(verbose_name='内容')
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
    created_date = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    published_date = models.DateTimeField(blank=True, null=True, verbose_name='发布时间')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', kwargs={'pk': self.pk})

    class Meta:
        verbose_name = '博客文章'
        verbose_name_plural = '博客文章'

2. 添加更多视图

# blog/views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.utils import timezone
from .models import Post
from .forms import PostForm

def post_list(request):
    posts = Post.objects.filter(published_date__isnull=False).order_by('-published_date')
    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})

@login_required
def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('blog:post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

@login_required
def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('blog:post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_edit.html', {'form': form})

@login_required
def post_delete(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.delete()
    return redirect('blog:post_list')

3. 创建表单

创建 blog/forms.py:

from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'content',)
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
        }

4. 更新 URL 配置

# blog/urls.py
from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    path('post/new/', views.post_new, name='post_new'),
    path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
    path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
]

5. 创建编辑模板

创建 blog/templates/blog/post_edit.html:

{% extends 'blog/base.html' %} {% block title %} {% if form.instance.pk
%}编辑文章{% else %}新建文章{% endif %} {% endblock %} {% block content %}
<h2>{% if form.instance.pk %}编辑文章{% else %}新建文章{% endif %}</h2>

<form method="POST" class="post-form">
  {% csrf_token %} {{ form.as_p }}
  <button type="submit" class="btn btn-primary">保存</button>
  <a href="{% url 'blog:post_list' %}" class="btn btn-secondary">取消</a>
</form>
{% endblock %}

6. 更新其他模板

更新 post_list.html 添加新建按钮:

{% extends 'blog/base.html' %} {% block title %}博客文章列表{% endblock %} {%
block content %}
<div style="margin-bottom: 20px;">
  <a href="{% url 'blog:post_new' %}" class="btn btn-primary">写新文章</a>
</div>

<h2>最新文章</h2>

{% if posts %} {% for post in posts %}
<article class="post">
  <h2>
    <a href="{% url 'blog:post_detail' pk=post.pk %}">{{ post.title }}</a>
  </h2>
  <div class="post-meta">
    作者: {{ post.author.username }} | 发布时间: {{
    post.published_date|date:"Y-m-d H:i" }}
  </div>
  <p>{{ post.content|truncatewords:30 }}</p>
  {% if user == post.author %}
  <div class="post-actions">
    <a
      href="{% url 'blog:post_edit' pk=post.pk %}"
      class="btn btn-sm btn-warning"
      >编辑</a
    >
    <a
      href="{% url 'blog:post_delete' pk=post.pk %}"
      class="btn btn-sm btn-danger"
      onclick="return confirm('确定要删除这篇文章吗?')"
      >删除</a
    >
  </div>
  {% endif %}
</article>
{% endfor %} {% else %}
<p>暂无文章</p>
{% endif %} {% endblock %}

常用 Django 命令

# 创建项目
django-admin startproject 项目名

# 创建应用
python manage.py startapp 应用名

# 创建数据库迁移
python manage.py makemigrations

# 应用数据库迁移
python manage.py migrate

# 创建超级用户
python manage.py createsuperuser

# 运行开发服务器
python manage.py runserver

# 收集静态文件
python manage.py collectstatic

# 进入Django shell
python manage.py shell

总结

Django 是一个功能强大的 Web 框架,通过这个简单的博客系统案例,你可以看到:

  1. 模型(Models):定义数据结构
  2. 视图(Views):处理业务逻辑
  3. 模板(Templates):展示数据
  4. URL 配置:路由请求
  5. 表单(Forms):处理用户输入
  6. 后台管理:管理数据

Django 的"MTV"架构(Model-Template-View)让代码结构清晰,易于维护。通过这个基础,你可以继续学习更多高级功能,如用户认证、API 开发、缓存、部署等。

最近更新:: 2025/8/14 09:20
Contributors: Duke
Prev
Python爬虫