Django Web框架核心入门实践
Django框架概述
Django作为主流Python Web框架之一,与Flask、Tornado等相比,其显著特点是"开箱即用"。框架内置了完整的ORM系统、模板引擎、缓存机制、会话管理、后台管理等功能模块,适合构建功能完备的企业级应用。
项目初始化与核心命令
通过命令行工具快速创建Django项目:
django-admin startproject myproject
项目创建后,常用管理命令包括:
python manage.py runserver 0.0.0.0:8000 # 启动开发服务器
python manage.py startapp myapp # 创建应用模块
python manage.py makemigrations # 生成数据库迁移文件
python manage.py migrate # 执行数据库迁移
python manage.py createsuperuser # 创建管理员账号
项目结构解析
标准Django项目包含以下核心文件:
settings.py- 全局配置文件urls.py- URL路由映射表wsgi.py- WSGI服务器入口配置manage.py- 项目管理脚本
应用模块设计哲学
Django采用"项目+应用"的架构模式。一个项目(Project)可包含多个相互独立的应用(App),每个应用实现特定业务功能。例如电商系统可拆分为:用户中心、商品管理、订单处理、支付网关等独立应用,这种设计有效降低了模块间耦合度。
构建首个应用
执行命令创建应用:
python manage.py startapp products
应用目录自动生成以下组件:
models.py- 数据模型定义views.py- 业务逻辑处理admin.py- 后台管理配置tests.py- 单元测试用例
管理后台集成
同步数据库结构并访问后台:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser # 按提示设置账号密码
启动服务后访问 http://127.0.0.1:8000/admin 即可进入管理界面。
URL路由配置
在根URL配置文件中引入应用视图:
# myproject/urls.py
from django.conf.urls import url
from django.contrib import admin
from products import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^catalog/$', views.product_list),
]
每个URL模式必须显式映射到视图函数,这是Django与其他框架的重要区别。
视图响应实现
创建返回HTML的视图函数:
# products/views.py
from django.shortcuts import render
def product_list(request):
items = ['笔记本', '鼠标', '键盘', '显示器']
return render(request, 'catalog.html', {'products': items})
若需返回纯文本响应:
from django.http import HttpResponse
def welcome(request):
return HttpResponse('<h1>欢迎使用产品管理系统</h1>')
模板渲染机制
在视图函数中传递数据到模板:
def catalog(request):
context_data = {
'category': '数码产品',
'count': 25,
'items': ['MacBook', 'iPhone', 'iPad', 'AirPods']
}
return render(request, 'catalog.html', context_data)
模板文件中使用变量和标签:
<!-- templates/catalog.html -->
<div class="header">
<h2>{{ category }}</h2>
<span>总数: {{ count }}</span>
</div>
<ul>
{% for item in items %}
<li>{{ forloop.counter }}. {{ item }}</li>
{% endfor %}
</ul>
自定义模板标签
扩展模板功能需要三步:
1. 在应用目录下创建templatetags包(必须包含__init__.py)
2. 定义标签模块:
# products/templatetags/custom_tags.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def calculate_total(price, quantity, tax):
return price * quantity + tax
@register.simple_tag
def render_input(field_id, css_class):
html = f"<input type='text' id='{field_id}' class='{css_class}'>"
return mark_safe(html)
3. 在模板中加载并使用:
{% load custom_tags %}
{% calculate_total 100 2 15 %}
{% render_input 'product_name' 'form-control' %}
模板继承体系
创建基础母板模板:
<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默认标题{% endblock %}</title>
<link rel="stylesheet" href="/static/css/main.css">
</head>
<body>
<header>通用导航栏</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>通用页脚</footer>
</body>
</html>
子模板继承并覆盖内容块:
{% extends 'base.html' %}
{% block title %}产品目录{% endblock %}
{% block content %}
<h1>产品列表</h1>
<!-- 具体页面内容 -->
{% endblock %}
静态文件管理
在项目根目录创建static文件夹,存放CSS/JS/图片等资源:
myproject/
├── static/
│ ├── css/
│ ├── js/
│ └── images/
在模板中引用静态文件:
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<script src="{% static 'js/main.js' %}"></script>
必须在settings.py中配置静态文件路径:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
数据模型与ORM
定义Product模型类:
# products/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100, verbose_name='产品名称')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格')
stock = models.IntegerField(default=0, verbose_name='库存')
is_available = models.BooleanField(default=True, verbose_name='是否在售')
def __str__(self):
return self.name
执行迁移命令创建数据表:
python manage.py makemigrations products
python manage.py migrate
CRUD操作实战
在视图中实现完整增删改查:
# products/views.py
from .models import Product
def inventory(request):
# 查询所有数据
products = Product.objects.all()
# 处理POST请求(新增或删除)
if request.method == 'POST':
action = request.POST.get('action')
if action == 'add':
# 创建新记录
Product.objects.create(
name=request.POST['name'],
price=request.POST['price'],
stock=request.POST['stock']
)
elif action == 'delete':
# 删除指定记录
product_id = request.POST['product_id']
Product.objects.filter(id=product_id).delete()
return render(request, 'inventory.html', {'products': products})
对应的模板实现:
<!-- templates/inventory.html -->
<form method="post">
{% csrf_token %}
<input type="text" name="name" placeholder="产品名称">
<input type="number" name="price" placeholder="价格">
<input type="number" name="stock" placeholder="库存">
<input type="hidden" name="action" value="add">
<button type="submit">添加产品</button>
</form>
<table>
<tr>
<th>ID</th>
<th>名称</th>
<th>价格</th>
<th>库存</th>
<th>操作</th>
</tr>
{% for p in products %}
<tr>
<td>{{ p.id }}</td>
<td>{{ p.name }}</td>
<td>{{ p.price }}</td>
<td>{{ p.stock }}</td>
<td>
<form method="post" style="display:inline;">
{% csrf_token %}
<input type="hidden" name="product_id" value="{{ p.id }}">
<input type="hidden" name="action" value="delete">
<button type="submit">删除</button>
</form>
</td>
</tr>
{% endfor %}
</table>
此示例完整演示了Django核心开发流程,涵盖路由、视图、模板、模型及静态资源等基础组件的协同工作。