手把手带你编写第一Django应用(官网demo)

 更新时间:2026年09月02日 09:13:27   作者:creaDelight  
这篇文章主要介绍了编写Django应用的相关资料,文中通过示例代码讲解了Python环境配置、项目搭建、数据库迁移及自动化测试,需要的朋友可以参考下

安装 Django

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

pip install django

创建项目

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

django-admin startproject mysite

目录结构如下:

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

验证:

python manage.py runserver

启动开发服务器

进入项目目录并运行:

python manage.py runserver

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

创建应用

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

python manage.py startapp polls

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

编写视图

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

from django.http import HttpResponse

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

配置 URL

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

from django.urls import path
from . import views

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

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

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)。执行迁移:

python manage.py migrate

创建模型

在 polls/models.py 中定义模型(例如 Question 和 Choice):

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.py 的 INSTALLED_APPS 中添加 'polls.apps.PollsConfig'。生成迁移文件并应用:

python manage.py makemigrations polls
python manage.py migrate

修改model

测试:

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

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

管理界面

创建超级用户:

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> 元素:

继续修改:

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

  • 转换 URLconf。

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

  • 基于 Django 的通用视图引入新的视图

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

首先得有个 Bug

幸运的是,我们的 polls 应用现在就有一个小 bug 需要被修复:我们的要求是如果 Question 是在一天之内发布的, Question.was_published_recently() 方法将会返回 True ,然而现在这个方法在 Question 的 pub_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,但后台页却没有显示多个选项。

总结

到此这篇关于编写第一Django应用的文章就介绍到这了,更多相关django项目实例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python基于爬虫实现全网搜索并下载音乐

    Python基于爬虫实现全网搜索并下载音乐

    这篇文章主要介绍了Python基于爬虫实现全网搜索并下载音乐的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-02-02
  • 如何用python绘制雷达图

    如何用python绘制雷达图

    这篇文章主要介绍了如何用python绘制雷达图,帮助大家更好的利用python进行数据分析,感兴趣的朋友可以了解下
    2021-04-04
  • Python实现解析yaml配置文件的示例详解

    Python实现解析yaml配置文件的示例详解

    在开发过程中,配置文件是少不了的,而且配置文件是有专门的格式的,比如:ini,yaml,toml等等。本文带大家来看看Python如何解析yaml文件,它的表达能力相比 ini 更加的强大,需要的可以参考一下
    2022-09-09
  • Python键鼠操作自动化库PyAutoGUI简介(小结)

    Python键鼠操作自动化库PyAutoGUI简介(小结)

    这篇文章主要介绍了Python键鼠操作自动化库PyAutoGUI简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • CentOS 7 安装python3.7.1的方法及注意事项

    CentOS 7 安装python3.7.1的方法及注意事项

    这篇文章主要介绍了CentOS 7 安装python3.7.1的方法,文中给大家提到了注意事项,需要的朋友可以参考下
    2018-11-11
  • Python configparser模块的用法示例代码

    Python configparser模块的用法示例代码

    这篇文章主要介绍了Python configparser模块的用法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Python实现字符串反转的常用方法分析【4种方法】

    Python实现字符串反转的常用方法分析【4种方法】

    这篇文章主要介绍了Python实现字符串反转的常用方法,结合具体实例形式分析了4种常用的Python字符串反转操作技巧,需要的朋友可以参考下
    2017-09-09
  • Python多进程通信Queue、Pipe、Value、Array实例

    Python多进程通信Queue、Pipe、Value、Array实例

    这篇文章主要介绍了Python多进程通信Queue、Pipe、Value、Array实例,queue和pipe用来在进程间传递消息、Value + Array 是python中共享内存映射文件的方法,需要的朋友可以参考下
    2014-11-11
  • Python实现打印http请求信息

    Python实现打印http请求信息

    这篇文章主要介绍了Python实现打印http请求信息方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 使用Python装饰器实现日志记录功能

    使用Python装饰器实现日志记录功能

    在现代软件开发中,日志记录是保障系统稳定性、可维护性和可追溯性的核心手段,无论是调试代码、排查问题,还是监控系统运行状态,日志都扮演着数字日记的角色,今天,我们将深入探讨装饰器在日志记录中的应用场景,并通过实战代码构建一个灵活、可扩展的日志系统
    2026-08-08

最新评论