首页 > 文章列表 > Django编程实战:从概念到实践

Django编程实战:从概念到实践

编程 Django 实战
183 2023-06-23

Django作为一个高效稳定的Python Web框架,拥有庞大的社区和丰富的生态系统,被越来越多的开发者所关注和采用。在本文中,我们将从Django的概念和特性入手,逐步实践一个简单博客应用,介绍Django的核心功能和常用库的使用。

第一部分:概念和架构

Django是MVC(Model-View-Controller)架构的Web框架,但它采用了稍有不同的模式,即MTV(Model-Template-View)架构。在Django中,视图(View)扮演了控制器(Controller)的角色,但与传统MVC不同的是,Django视图并不直接处理HTTP请求和响应,而是借助Django的URL路由和Django模板引擎来完成功能的实现和数据的渲染。因此,Django的工作流程可以描述为:

  1. 浏览器发起HTTP请求,请求被Django服务器捕获;
  2. Django的URL路由根据请求的URL路径,选择对应的视图函数进行处理;
  3. 视图函数可能需要与数据库进行交互,操作数据;
  4. 视图函数将数据传递给Django模板引擎,进行页面渲染;
  5. 渲染结果返回给浏览器,完成HTTP响应。

以上流程形成了一个闭环,从而实现了Web应用的功能和展现。下面我们将逐步介绍如何使用Django实现一个简单博客应用。

第二部分:项目的创建与配置

开发一个应用前,我们需要先创建一个Django项目,并进行相关的配置。在命令行界面中进入项目的父目录,输入以下命令:

django-admin startproject myproject

其中,myproject为项目的名称,可以根据需求进行更改。创建完成后,我们来看一下Django项目的目录结构:

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

其中,manage.py是我们启动项目和管理数据库的主要工具,myproject是应用的主目录,__init__.py是一个空文件,settings.py包含了各种设置,urls.py包含了路由映射规则,asgi.pywsgi.py用于处理异步请求和静态资源,我们暂且不用关心这两个文件。

settings.py文件中,我们需要设置数据库、静态文件、中间件等各种选项,这里仅介绍几个常用的设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',  # 数据库类型
        'NAME': BASE_DIR / 'db.sqlite3',  # 数据库文件路径
    }
}

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

以上三个设置分别定义了SQLite数据库、静态文件路径和中间件。我们可以根据实际情况进行修改,如使用MySQL数据库、CDN存储静态文件、添加自定义中间件等。

第三部分:模型和数据操作

在Django中,模型(Model)定义了数据结构和操作,与数据库进行交互。每个模型类都继承了django.db.models.Model类,拥有多个字段(Field)表示数据的类型、属性和约束。我们来看一个简单的例子:

from django.db import models

class Blog(models.Model):
  title = models.CharField(max_length=255)  # 标题
  author = models.CharField(max_length=255)  # 作者
  content = models.TextField()  # 内容
  created_at = models.DateTimeField(auto_now_add=True)  # 创建时间
  updated_at = models.DateTimeField(auto_now=True)  # 修改时间

  def __str__(self):
    return self.title

以上代码定义了一个博客模型类,包含了标题、作者、内容、创建时间和修改时间五个字段。__str__方法返回了博客的标题,用于在后台管理页面中显示。我们可以通过python manage.py makemigrations命令生成数据库迁移脚本,在运行python manage.py migrate命令后完成数据库与模型的同步。

Django提供了丰富的API操作数据库,如:

  • 新建模型数据:Blog.objects.create(title='...', author='...', content='...')
  • 获取所有模型数据:Blog.objects.all()
  • 获取单个模型数据:Blog.objects.get(title='...')
  • 更新模型数据:blog.title = 'new title'; blog.save()
  • 删除模型数据:blog.delete()
  • 查询模型数据:Blog.objects.filter(title__contains='python')

另外,Django还支持链式查询、模型关联、聚合函数等高级查询方法,使得数据操作变得更加方便和高效。

第四部分:视图和URL路由

在Django中,视图函数(View)负责接收和处理HTTP请求,返回HTTP响应。我们可以在views.py中定义视图函数,如下例所示:

from django.shortcuts import render, redirect
from .models import Blog

def index(request):
  blogs = Blog.objects.all()
  return render(request, 'index.html', {'blogs': blogs})

def create(request):
  if request.method == 'POST':
    title = request.POST.get('title')
    author = request.POST.get('author')
    content = request.POST.get('content')
    Blog.objects.create(title=title, author=author, content=content)
    return redirect('/')

  return render(request, 'create.html')

以上代码定义了两个视图函数,分别是首页展示所有博客数据和创建新博客。index函数使用render方法渲染了一个名为index.html的模板文件,其中传递了一个名为blogs的变量,它的值是所有博客数据的列表。create函数根据请求的方法判断是否是POST请求,如果是,则从表单中获取标题、作者、内容三个字段,新建一条博客数据,并重定向回首页;否则,渲染一个名为create.html的模板文件。关于模板文件的语法和使用,我们将在下一部分进行介绍。

除了视图函数,我们还需要在urls.py中定义URL路由规则,将请求的URL映射到对应的视图函数上。例如,以下代码定义了博客应用的路由规则:

from django.urls import path
from .views import index, create

urlpatterns = [
  path('', index, name='index'),
  path('create/', create, name='create'),
]

以上代码定义了两条路由规则,分别是根路径对应index函数,创建博客路径对应create函数。其中,name参数是可选的,用于在代码中引用该路由。

第五部分:模板和视图渲染

Django使用模板引擎将视图函数处理的数据渲染到HTML页面中,从而生成最终的HTTP响应。Django内置了一套模板引擎,也支持第三方模板库,如Jinja2和Mako等。同时,Django还提供了一些常用的标签、过滤器和模板继承等实用功能。

我们来看一下如何使用模板引擎渲染数据。以下是一个简单的模板文件:

{% extends 'base.html' %}

{% block content %}
  <h1>博客列表</h1>
  {% if blogs %}
    <ul>
      {% for blog in blogs %}
        <li>{{ blog.title }} - {{ blog.author }} - {{ blog.created_at }}</li>
      {% endfor %}
    </ul>
  {% else %}
    <p>暂无博客数据</p>
  {% endif %}
{% endblock %}

以上代码定义了一个content块,渲染了所有博客数据的标题、作者和创建时间。如果博客数据列表为空,则显示“暂无博客数据”的提示信息。其中,extends标签用于继承base.html文件,block标签定义了命名块,方便在其他文件中继承和重写。

在视图函数中,我们可以使用render方法将数据和模板渲染成HTML页面:

from django.shortcuts import render
from .models import Blog

def index(request):
  blogs = Blog.objects.all()
  return render(request, 'index.html', {'blogs': blogs})

以上代码使用render方法渲染了名为index.html的模板文件,传递了一个名为blogs的变量,它的值是所有博客数据的列表。render方法还可以传递其他变量和参数,如模板路径、上下文、HTTP状态码、MIME类型等。

第六部分:后台管理和静态文件

在Django中,我们可以使用内置的后台管理功能,对模型数据进行增删改查等操作,而无需在视图函数中编写特定的代码。只需要在admin.py中注册相关的模型即可,如以下代码所示:

from django.contrib import admin
from .models import Blog

admin.site.register(Blog)

在后台管理界面中,我们可对每个模型进行个性化设置,如定义显示字段、过滤器、搜索框、排序等。

另外,Django支持使用静态文件,包括CSS、JavaScript和图片等。我们只需要在settings.py文件中设置静态文件路径和访问URL,然后在模板文件中通过{% static %}标签引用即可。例如,以下代码定义了一个静态文件路径和引用方式:

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

以上代码定义了静态文件访问URL和路径,其中os.path.join(BASE_DIR, "static")表示在项目根目录下创建了static文件夹,用于存储静态文件。在模板文件中,我们可以这样引用静态文件:

<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">

以上代码引用了名为style.css的CSS文件,它位于static/css目录下。

结语

本文从Django架构、项目创建、模型操作、视图渲染、静态文件和后台管理等多个方面,介绍了Django的核心概念和实战应用。虽然Django具有很高的灵活性和扩展性,但对于初学者来说,掌握Django的核心原理和功能,才是更为重要的。希望本文对大家在Django的学习和实践中,有所帮助和启发。