当前位置: 代码网 > it编程>前端脚本>Python > 手把手带你编写第一Django应用(官网demo)

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

2026年09月02日 Python 我要评论
安装 django确保 python 已安装(推荐 3.8+版本),通过以下命令安装 django:pip install django创建项目使用django-admin创建新项目(例如django

安装 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项目实例内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com