编写你的第一个 Django 应用(官网demo)

安装 Django

确保 Python 已安装(推荐 3.8+版本),通过以下命令安装 Django:

bash 复制代码
pip install django

创建项目

使用 django-admin 创建新项目(例如 djangotutorial):

bash 复制代码
django-admin startproject mysite

目录结构如下:

复制代码
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

验证:

复制代码
python manage.py runserver

启动开发服务器

进入项目目录并运行:

bash 复制代码
python manage.py runserver

访问 http://127.0.0.1:8000/ 确认服务正常。

创建应用

在项目中创建应用(例如 polls):

bash 复制代码
python manage.py startapp polls

目录新增 polls/,包含 views.pymodels.py 等文件。

编写视图

编辑 polls/views.py,添加简单视图:

python 复制代码
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

配置 URL

polls 目录下创建 urls.py,定义路由:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

在项目 mysite/urls.py 中引入应用路由:

python 复制代码
from django.contrib import admin
from django.urls import include, path

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

测试运行

重启开发服务器,访问 http://127.0.0.1:8000/polls/,页面应显示 Hello, world.

数据库配置

编辑 mysite/settings.py,配置 DATABASES(默认使用 SQLite)。执行迁移:

bash 复制代码
python manage.py migrate

创建模型

polls/models.py 中定义模型(例如 QuestionChoice):

python 复制代码
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

激活模型

settings.pyINSTALLED_APPS 中添加 'polls.apps.PollsConfig'。生成迁移文件并应用:

bash 复制代码
python manage.py makemigrations polls
python manage.py migrate

修改model

测试:

新加入的 import datetimefrom django.utils import timezone 分别导入了 Python 的标准 datetime 模块和 Django 中和时区相关的 django.utils.timezone 工具模块。

保存这些更改后,请启动一个新的 Python 交互式 Shell。(如果三个大于号提示符 (>>>) 表明你仍在 Shell 中,需要先使用 exit() 退出)。再次运行 python manage.py shell 以重新加载模型。

管理界面

创建超级用户:

bash 复制代码
python manage.py createsuperuser

访问 http://127.0.0.1:8000/admin/ 登录,在 admin.py 中注册模型以管理数据:

向管理页面中加入投票应用

但是我们的投票应用在哪呢?它没在索引页面里显示。

只需要再做一件事:我们得告诉管理,问题 Question 对象需要一个后台接口。打开 polls/admin.py 文件,把它编辑成下面这样:

复制代码
from django.contrib import admin

from .models import Question

admin.site.register(Question)

体验便捷的管理功能

现在我们向管理页面注册了问题 Question 类。Django 知道它应该被显示在索引页里:

写一个有用的视图:

修改相关内容,我们在 index() 函数里插入了一些新内容,让它能展示数据库里以发布日期排序的最近 5 个投票问题,以空格分割:

首先,在你的 polls 目录里创建一个 templates 目录。Django 将会在这个目录里查找模板文件。

你项目的 TEMPLATES 配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并将 APP_DIRS 设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 "templates" 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。

在你刚刚创建的 templates 目录里,再创建一个目录 polls,然后在其中新建一个文件 index.html 。换句话说,你的模板文件的路径应该是 polls/templates/polls/index.html 。因为``app_directories`` 模板加载器是通过上述描述的方法运行的,所以 Django 可以引用到 polls/index.html 这一模板了。

编写一个简单的表单

让我们更新一下在上一个教程中编写的投票详细页面的模板 ("polls/detail.html") ,让它包含一个 HTML <form> 元素:

继续修改:

让我们将我们的投票应用转换成使用通用视图系统,这样我们可以删除许多我们的代码。我们仅仅需要做以下几步来完成转换,我们将:

  1. 转换 URLconf。

  2. 删除一些旧的、不再需要的视图。

  3. 基于 Django 的通用视图引入新的视图

开始写我们的第一个自动化测试:

首先得有个 Bug

幸运的是,我们的 polls 应用现在就有一个小 bug 需要被修复:我们的要求是如果 Question 是在一天之内发布的, Question.was_published_recently() 方法将会返回 True ,然而现在这个方法在 Questionpub_date 字段比当前时间还晚时也会返回 True(这是个 Bug)。

shell 命令确认一下这个方法的日期bug

创建一个测试来暴露这个 bug

我们刚刚在 shell 里做的测试也就是自动化测试应该做的工作。所以我们来把它改写成自动化的吧。

按照惯例,Django 应用的测试应该写在应用的 tests.py 文件里。测试系统会自动的在所有文件里寻找并执行以 test 开头的测试函数。

将下面的代码写入 polls 应用里的 tests.py 文件内:

结果显示:

更全面的测试

我们已经搞定一小部分了,现在可以考虑全面的测试 was_published_recently() 这个方法以确定它的安全性,然后就可以把这个方法稳定下来了。事实上,在修复一个 bug 时不小心引入另一个 bug 会是非常令人尴尬的。

我们在上次写的类里再增加两个测试,来更全面的测试这个方法:

测试视图

我们的投票应用对所有问题都一视同仁:它将会发布所有的问题,也包括那些 pub_date 字段值是未来的问题。我们应该改善这一点。如果 pub_date 设置为未来某天,这应该被解释为这个问题将在所填写的时间点才被发布,而在之前是不可见的。

改善视图代码

现在的投票列表会显示将来的投票( pub_date 值是未来的某天)。我们来修复这个问题。

测试新视图

现在你可以通过启动 runserver 来验证其行为是否符合预期:在浏览器中加载网站,创建一些过去和未来日期的 Question 条目,然后确认只有已发布的条目才会显示在列表中。你肯定不希望 每次做出可能影响此功能的修改时 都手动重复这一流程------因此让我们基于之前的 shell 会话内容来创建一个测试。

自定义 应用 的界面和风格

首先,在你的 polls 目录下创建一个名为 static 的目录。Django 将在该目录下查找静态文件,这种方式和 Diango 在 polls/templates/ 目录下查找 template 的方式类似。

Django 的 STATICFILES_FINDERS 设置包含了一系列的查找器,它们知道去哪里找到 static 文件。AppDirectoriesFinder 是默认查找器中的一个,它会在每个 INSTALLED_APPS 中指定的应用的子文件中寻找名称为 static 的特定文件夹,就像我们在 polls 中刚创建的那个一样。管理后台采用相同的目录结构管理它的静态文件。

在你刚创建的 static 文件夹中创建一个名为 polls 的文件夹,再在 polls 文件夹中创建一个名为 style.css 的文件。换句话说,你的样式表路径应是 polls/static/polls/style.css。因为 AppDirectoriesFinder 的存在,你可以在 Django 中以 polls/style.css 的形式引用此文件,类似你引用模板路径的方式。

添加一个背景图

接下来,我们将为图像创建一个子目录。 在 polls/static/polls/ 目录中创建 images 子目录。 在此目录中,添加您想用作背景的任何图像文件。 出于本教程的目的,我们使用了一个名为"background.png"的文件,它的完整路径为"polls/static/polls/images/background.png"。

自定义后台表单

通过 admin.site.register(Question) 注册 Question 模型,Django 能够构建一个默认的表单用于展示。通常来说,你期望能自定义表单的外观和工作方式。你可以在注册模型时将这些设置告诉 Django。

添加关联的对象

好了,现在我们有了投票的后台页。不过,一个 Question 有多个 Choice,但后台页却没有显示多个选项。

相关推荐
喵手2 小时前
Python 爬虫实战:利用 Playwright 攻克 Canva 动态设计模板库
爬虫·python·爬虫实战·playwright·canva·零基础python爬虫教学·搭建动态设计模版库
进击的小头2 小时前
第4篇:二阶系统的时域响应分析
python·算法
赵谨言2 小时前
基于YOLOv5的火灾检测研究是当前计算机视觉和消防安全领域的重要研究方向
大数据·开发语言·经验分享·python
ZhengEnCi2 小时前
P1C-Python变量和数据类型详解
python
chushiyunen2 小时前
django venv虚拟环境
后端·python·django
GDAL2 小时前
qpip 教程:把 Python 包安装、项目脚本和虚拟环境统一到一个命令里
python·pip·venv
弈风千秋万古愁2 小时前
常见配置文件-AI辅助
开发语言·python
花间相见2 小时前
【JAVA基础01】——类和对象
java·开发语言·python
小鸡吃米…2 小时前
自然语言处理 ——Python 实现
人工智能·python·自然语言处理