当前位置:首页 > 技术 > 正文内容

Django Web框架核心入门实践

访客 技术 2026年10月3日 1

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核心开发流程,涵盖路由、视图、模板、模型及静态资源等基础组件的协同工作。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。