MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python Django框架的快速入门

2022-11-076.0k 阅读

什么是 Django 框架

Django 是一个高级的 Python 网络框架,它鼓励快速开发和简洁、实用的设计。由经验丰富的开发者构建,它可以处理很多 Web 开发的麻烦事,因此你可以专注于编写应用,而无需重新发明轮子。Django 遵循模型 - 视图 - 控制器(MVC)架构模式的变体,称为模型 - 视图 - 模板(MVT)。

模型(Model)

模型代表你的数据结构。在 Django 中,你使用 Python 类来定义模型。每个模型类都是 django.db.models.Model 的子类。模型类的每个属性代表数据库表中的一个字段。例如,假设我们正在构建一个博客应用,我们可能有一个 Post 模型:

from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')

在这个例子中,Post 模型有三个字段:title(字符字段,最大长度为 200),content(文本字段)和 pub_date(日期时间字段)。

视图(View)

视图是处理用户请求并返回响应的 Python 函数或类。视图获取数据(通常通过模型),进行必要的处理,然后将数据传递给模板进行渲染。例如,对于上述的博客应用,我们可能有一个视图来显示所有的文章:

from django.http import HttpResponse
from.models import Post


def post_list(request):
    posts = Post.objects.all()
    output = ', '.join([p.title for p in posts])
    return HttpResponse(output)

这个视图函数 post_list 获取所有的 Post 对象,并将它们的标题连接成一个字符串,然后作为 HTTP 响应返回。

模板(Template)

模板是包含占位符和标签的文本文件,用于动态生成 HTML。Django 的模板语言允许你插入变量、控制结构(如循环和条件语句)。例如,对于博客应用的文章列表,我们可以创建一个模板 post_list.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Post List</title>
</head>

<body>
    <ul>
        {% for post in posts %}
        <li>{{ post.title }}</li>
        {% endfor %}
    </ul>
</body>

</html>

在这里,{% for %}{% endfor %} 是 Django 模板标签,用于循环遍历 posts 变量中的每个元素。{{ post.title }} 是一个变量占位符,用于插入每个 Post 对象的标题。

安装 Django

在开始使用 Django 之前,你需要安装它。如果你已经安装了 Python 和 pip(Python 的包管理器),安装 Django 非常简单。打开你的终端并运行以下命令:

pip install django

这将从 Python 包索引下载并安装最新版本的 Django。如果你想安装特定版本,可以指定版本号,例如:

pip install django==3.2

创建 Django 项目

安装好 Django 后,你可以创建一个新的 Django 项目。在终端中,导航到你想要创建项目的目录,然后运行以下命令:

django - admin startproject myproject

这将创建一个名为 myproject 的新目录,其中包含以下结构:

myproject/
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    manage.py
  • manage.py:一个命令行实用程序,用于与你的项目进行各种交互。例如,运行开发服务器、执行数据库迁移等。
  • myproject/settings.py:项目的设置和配置。在这里你可以配置数据库、安装的应用、静态文件路径等。
  • myproject/urls.py:项目的 URL 声明,就像网站的“目录”。它告诉 Django 如何将 URL 映射到视图。

创建 Django 应用

一个 Django 项目可以包含多个应用。应用是一个自包含的组件,通常用于完成特定的功能,比如博客、用户认证等。要创建一个新的应用,在项目根目录(包含 manage.py 的目录)下运行以下命令:

python manage.py startapp blog

这将创建一个名为 blog 的新目录,结构如下:

blog/
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py
  • models.py:定义应用的数据模型。
  • views.py:定义处理用户请求的视图函数或类。
  • admin.py:用于配置 Django 管理界面,以便轻松管理应用的数据。

配置数据库

默认情况下,Django 使用 SQLite 数据库,这对于开发和小型项目非常方便。如果你想使用其他数据库,如 PostgreSQL、MySQL 等,你需要在 settings.py 文件中进行配置。

使用 SQLite

如果使用 SQLite,你不需要做太多配置。settings.py 文件中已经有以下默认配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

这表明 Django 将使用 SQLite 数据库,数据库文件名为 db.sqlite3,位于项目根目录。

使用 PostgreSQL

要使用 PostgreSQL,首先需要安装 psycopg2 库(Django 与 PostgreSQL 交互的驱动):

pip install psycopg2

然后在 settings.py 中修改数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'your_database_name',
        'USER': 'your_username',
        'PASSWORD': 'your_password',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

your_database_nameyour_usernameyour_password 替换为实际的数据库名称、用户名和密码。

定义模型

models.py 文件中定义你的数据模型。回到我们的博客应用示例,假设我们除了 Post 模型外,还想定义一个 Author 模型:

from django.db import models


class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()


class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

这里,Author 模型有 nameemail 两个字段。Post 模型新增了一个 author 字段,它是一个外键,关联到 Author 模型。on_delete=models.CASCADE 表示当关联的 Author 对象被删除时,所有相关的 Post 对象也将被删除。

数据库迁移

定义好模型后,你需要创建数据库迁移文件,并将这些更改应用到数据库中。首先,运行以下命令创建迁移文件:

python manage.py makemigrations

这将在应用的 migrations 目录中创建迁移文件,记录你对模型所做的更改。然后,运行以下命令将这些迁移应用到数据库:

python manage.py migrate

migrate 命令会根据迁移文件,在数据库中创建相应的表结构。

创建视图

视图负责处理用户请求并返回响应。在 views.py 文件中定义视图函数。继续以博客应用为例,我们来创建一个视图显示特定作者的所有文章:

from django.http import HttpResponse
from.models import Post, Author


def author_posts(request, author_id):
    try:
        author = Author.objects.get(id=author_id)
        posts = Post.objects.filter(author=author)
        output = ', '.join([p.title for p in posts])
        return HttpResponse(output)
    except Author.DoesNotExist:
        return HttpResponse("Author not found")

在这个视图函数 author_posts 中,我们通过 author_id 获取特定的 Author 对象,然后获取该作者的所有 Post 对象,并将文章标题连接成字符串返回。如果作者不存在,则返回“Author not found”。

配置 URL

URL 配置将 URL 映射到相应的视图。在项目的 urls.py 文件中,你可以包含应用的 URL 配置。首先,在项目的 urls.py 中添加以下代码:

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


urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
]

这里,path('blog/', include('blog.urls')) 表示所有以 /blog/ 开头的 URL 都将由 blog 应用的 urls.py 文件来处理。接下来,在 blog 应用的 urls.py 文件中(如果不存在,需要创建)添加以下代码:

from django.urls import path
from. import views


urlpatterns = [
    path('author/<int:author_id>/', views.author_posts, name='author_posts'),
]

path('author/<int:author_id>/', views.author_posts, name='author_posts') 表示 URL /blog/author/<author_id>/ 将映射到 views.author_posts 视图函数,其中 <int:author_id> 是一个动态部分,int 表示它应该是一个整数,author_id 将作为参数传递给视图函数。

创建模板

模板用于渲染 HTML 页面。在 blog 应用中创建一个 templates 目录,然后在其中创建 blog 目录(与应用名相同)。在 blog/blog 目录下创建 author_posts.html 模板:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>{{ author.name }}'s Posts</title>
</head>

<body>
    <h1>{{ author.name }}'s Posts</h1>
    <ul>
        {% for post in posts %}
        <li>{{ post.title }}</li>
        {% endfor %}
    </ul>
</body>

</html>

这个模板接收 authorposts 变量,并显示作者的名字和他的所有文章标题。

在视图中使用模板

现在,我们需要修改 author_posts 视图函数,使其使用模板来渲染响应:

from django.shortcuts import render
from.models import Post, Author


def author_posts(request, author_id):
    try:
        author = Author.objects.get(id=author_id)
        posts = Post.objects.filter(author=author)
        context = {
            'author': author,
            'posts': posts
        }
        return render(request, 'blog/author_posts.html', context)
    except Author.DoesNotExist:
        return HttpResponse("Author not found")

这里,我们使用 render 函数,它接受请求对象、模板名称和上下文(一个包含传递给模板的变量的字典),并返回一个渲染后的 HTTP 响应。

管理界面

Django 自带一个强大的管理界面,让你可以轻松管理应用的数据。首先,在 admin.py 文件中注册你的模型:

from django.contrib import admin
from.models import Author, Post


admin.site.register(Author)
admin.site.register(Post)

然后,运行开发服务器:

python manage.py runserver

在浏览器中访问 http://127.0.0.1:8000/admin/,你将看到 Django 管理登录页面。默认情况下,你需要创建一个超级用户来登录。运行以下命令创建超级用户:

python manage.py createsuperuser

按照提示输入用户名、电子邮件和密码。登录后,你可以在管理界面中创建、编辑和删除 AuthorPost 对象。

静态文件

静态文件包括 CSS、JavaScript 和图像等。在 Django 中,你需要配置静态文件的路径。首先,在 settings.py 文件中添加以下配置:

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR /'static'
]

这表示静态文件的 URL 前缀是 /static/,并且项目的 static 目录将用于存储静态文件。例如,如果你在 static 目录下创建一个 css 目录,并在其中放置一个 styles.css 文件,你可以在模板中这样引用它:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>{{ author.name }}'s Posts</title>
    <link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>

<body>
    <h1>{{ author.name }}'s Posts</h1>
    <ul>
        {% for post in posts %}
        <li>{{ post.title }}</li>
        {% endfor %}
    </ul>
</body>

</html>

{% static 'css/styles.css' %} 是 Django 模板标签,用于生成静态文件的正确 URL。

处理表单

Django 提供了强大的表单处理功能。假设我们想在博客应用中添加一个表单,让用户提交新文章。首先,在 forms.py 文件中(如果不存在,需要创建)定义表单类:

from django import forms
from.models import Post


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content', 'author']

这里,我们使用 ModelForm,它根据 Post 模型自动生成表单。fields 定义了表单中包含的字段。

在视图中处理表单

views.py 中添加一个视图函数来处理表单提交:

from django.shortcuts import render, redirect
from.forms import PostForm


def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'blog/create_post.html', {'form': form})

如果请求方法是 POST,表示用户提交了表单,我们验证表单数据是否有效。如果有效,保存表单数据并重定向到文章列表页面。如果请求方法是 GET,我们显示一个空表单。

创建表单模板

blog/blog 目录下创建 create_post.html 模板:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Create Post</title>
</head>

<body>
    <h1>Create Post</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
</body>

</html>

{% csrf_token %} 用于防止跨站请求伪造攻击。{{ form.as_p }} 将表单字段渲染为段落格式。

总结

通过以上步骤,你已经了解了 Django 框架的基本使用方法,包括项目和应用的创建、模型定义、视图编写、URL 配置、模板使用、管理界面、静态文件处理和表单处理等。随着你对 Django 的深入学习,你可以探索更多高级功能,如用户认证、缓存、RESTful API 开发等,以构建更强大的 Web 应用。