创建并运行您的第一个 Django 项目
最后修改时间:2023 年 11 月 15 日在本教程中,我们将创建一个基本的待办事项应用程序。
在你开始之前
确保满足以下先决条件:
您正在使用 PyCharm 版本 2022.2 或更高版本。如果您仍然没有 PyCharm,请从此页面下载。要安装 PyCharm,请按照说明进行操作,具体取决于您的平台。
本教程是在以下假设的情况下创建的:
Python 3.11
姜戈 4.2。
创建一个新项目
转到 文件 | 新建项目,或单击欢迎屏幕中的新建项目按钮。“新建项目”对话框打开。
在“新建项目”对话框中,执行以下操作:
指定项目类型Django。
如果需要,请更改默认项目位置。
保留默认的项目 venv解释器类型。
单击 更多设置,然后在应用程序名称字段中指定待办事项。
单击创建。
探索项目结构
新创建的项目包含 Django 特定的文件和目录。
项目的结构在项目工具窗口( ) 中可见:Alt01
myDjangoProject目录是您的项目的容器。它用粗体字表示。
嵌套目录myDjangoProject是项目的实际 Python 包。
myDjangoProject/__init__.py:这个空文件告诉 Python 该目录应该被视为 Python 包。
myDjangoProject/settings.py:此文件包含Django 项目的配置。
myDjangoProject/urls.py:此文件包含Django 项目的 URL 声明。
myDjangoProject/wsgi.py:此文件定义了 WSGI 兼容 Web 服务器的入口点来为您的项目提供服务。有关更多信息,请参阅如何使用 WSGI 进行部署。
模板目录现在是空的。它将包含 Django 模板。
嵌套目录todo包含开发 Django 应用程序所需的所有文件:
嵌套目录迁移目前仅包含包文件_init_.py,但将来将用于将对模型所做的更改(添加字段、删除模型等)传播到数据库架构中。请阅读此处的迁移说明。
Manage.py是一个命令行实用程序,可让您与 Django 项目进行交互。有关更多信息,请参阅Django 文档。
启动 Django 服务器
Django服务器运行/调试配置是自动创建的。如果需要,您可以通过选择主工具栏上的运行/调试配置列表中的编辑配置命令来编辑它:
例如,您可以选择在启动配置时自动打开浏览器窗口:
单击运行myDjangoProject配置。如果浏览器窗口没有自动打开,请单击“运行”工具窗口中的链接。
打开以下页面:
创建模型
Django模型定义数据的字段和行为。它们由 Python 类表示,这些类是该类的子类django.db.models.Model
。
让我们ToDoItem
为我们的待办事项应用程序创建一个模型。为此,请打开todo/models.py并填充以下代码:
from django.db import models
from django.utils import timezone
class ToDoItem(models.Model):
text = models.CharField(max_length=100)
due_date = models.DateField(default=timezone.now)
该模型有两个由字段类实例表示的类变量:
text
:类的实例CharField
,我们将使用它来存储应该做什么的描述。due_date
:类的一个实例DateField
,我们将使用它来存储待办事项的截止日期。
有关模型字段的更多信息,请参阅Django 文档。
运行迁移
默认情况下,PyCharm 会自动为 Django 项目创建 SQLite 数据库。我们需要在数据库中为todo
应用程序和ToDoItem
模型创建表。在 Django 中,这是通过使用migrations来完成的。迁移是人类可编辑的文件,其中存储对数据模型的更改。
按打开manage.py控制台。CtrlAlt0R
键入
makemigrations
后跟.Enter您应该
Process finished with exit code 0
在控制台输出中看到。todo /migrations目录现在包含迁移文件0001_initial.py:键入
migrate
并按以应用更改并在数据库中为两个新模型创建表:Enter
写一个视图
Django视图是指定如何处理 Web 请求以及返回哪些 Web 响应的函数或类。按照约定,视图在<app_dir>/views.py中定义,其中<app_dir>是 Django 应用程序目录。
打开todo/views.py并填充以下代码:
from django.views.generic import ListView
from .models import ToDoItem
class AllToDos(ListView):
model = ToDoItem
template_name = "todo/index.html"
这里我们定义了AllToDos
继承自 DjangoListView
基本视图类的类。我们将使用此视图来显示所有可用的待办事项。
创建模板
Django 模板基本上是一个 html 文件,其中包含Django 模板语言的元素。模板用于根据视图提供的上下文生成 html 页面。
您可以看到todo/index.html
在views.py中突出显示为未解析的引用:
PyCharm 建议一个快速修复:如果将鼠标悬停在index.html
或按,您可以选择在templates文件夹中创建相应的模板文件:AltEnter
PyCharm 还会创建此模板应驻留的目录todo 。确认该操作:
PyCharm 创建并打开todo/index.html。要使用一些基本的 html 代码填充它,请输入html:5
以下内容:Tab
让我们将带有 Django 模板语言元素的内容添加到模板中。将以下代码粘贴到body
标签之间:
<h1>Things to do:</h1>
<table>
{% for item in object_list %}
<tr>
<td>{{ item.text }}</td>
<td>{{ item.due_date }}</td>
</tr>
{% endfor %}
</table>
有一个h1
标题和一个表格。我们使用循环来迭代将从视图传递的for
项目。对于每个项目,Django 将在表中呈现一行,其中包含和的值。object_list
AllToDos
text
due_date
配置网址
AllToDos
现在我们需要配置在浏览器中访问视图的方式。
在todo目录中,创建文件 urls.py并填充以下代码:
from django.urls import path from . import views urlpatterns = [ path("", views.AllToDos.as_view(), name="index") ]
接下来,打开文件myDjangoProject/urls.py (PyCharm 已为您创建)并将其配置为包含todo/urls.py中的路径。您最终应该得到以下代码:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path("todo/", include("todo.urls")), path("admin/", admin.site.urls), ]
不要忘记导入
django.urls.include
!在浏览器中打开页面http://127.0.0.1:8000/todo/ 。您应该看到以下文本:
有一个标题,但还没有待办事项。让我们使用 Django 管理界面来添加任务。
使用 Django 管理
管理站点允许添加、编辑和以其他方式管理内容。默认情况下,PyCharm 自动为新的 Django 项目启用 Django 管理界面。
设置管理站点
首先,我们需要创建一个超级用户。为此,请输入
createsuperuser
manage.py控制台( ),指定您的电子邮件地址和密码。CtrlAlt0R现在转到
/admin/
Django 服务器,例如http://127.0.0.1:8000/admin/。您应该看到以下登录页面:
登录后,将显示管理页面。它具有身份验证和授权(组和用户)部分,但无法添加待办事项。为此,我们必须ToDoItem
在管理界面中注册模型。
添加内容
打开文件todo/admin.py,然后输入以下代码:
from django.contrib import admin from .models import ToDoItem admin.site.register(ToDoItem)
在浏览器中刷新页面。应出现包含待办事项的TODO部分:
单击“添加”以创建待办事项:
准备好后,单击“保存”。
新创建的待办事项在列表中显示为ToDoItem object (1)
。这种命名使内容管理变得复杂,因为您必须打开每个任务才能阅读其描述。
让我们通过__str__()
向ToDoItem
模型添加一个方法来解决这个问题。打开todo/models.py并添加以下内容:
def __str__(self):
return f"{self.text}: due {self.due_date}"
您最终应该得到以下结果:
from django.db import models
from django.utils import timezone
class ToDoItem(models.Model):
text = models.CharField(max_length=100)
due_date = models.DateField(default=timezone.now)
def __str__(self):
return f"{self.text}: due {self.due_date}"
待办事项列表现在提供了所有必需的信息:
提供功能
现在,您已经添加了一些待办事项,请再次访问http://127.0.0.1:8000/todo/。任务列表应该在那里:
过滤以仅显示今天应完成的任务怎么样?让我们将此功能添加到我们的应用程序中。
转到views.pyTodayToDos
并使用以下代码添加类:
class TodayToDos(ListView):
model = ToDoItem
template_name = "todo/today.html"
def get_queryset(self):
return ToDoItem.objects.filter(due_date=date.today())
这个类与 非常相似AllToDos
,除了它使用另一个模板(我们稍后将创建)并实现get_queryset
仅返回今天的ToDoItem
对象的方法due_date
。
date
应用红色波浪线突出显示。将鼠标悬停在其上,单击“导入此名称”,然后选择“datetime.date”以在文件开头添加相应的导入语句。
我们需要创建Today.html模板。为了避免从index.html复制粘贴并在项目中出现重复的代码,我们将使用Django模板继承。
通过右键单击“项目”工具窗口中的模板并选择“新建”| “myDjangoProject/templates” ,在myDjangoProject/templates 中创建base.html 。上下文菜单中的HTML 文件。
将代码从index.html复制到base.html,然后
<body>
用以下内容替换标签之间的所有内容:{% block content %}{% endblock %}
myDjangoProject
/templates 应该是这样的:/base.html <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> {% block content %}{% endblock %} </body> </html>
转到index.html
<h1>
,删除除和标记内容之外的所有内容<table>
,然后将它们包含在 Django 模板语言元素中,如下所示:{% extends "base.html" %} {% block content %} <h1>Things to do:</h1> <table> {% for item in object_list %} <tr> <td>{{ item.text }}</td> <td>{{ item.due_date }}</td> </tr> {% endfor %} </table> {% endblock %}
创建myDjangoProject
/templates 并用以下代码填充它:/todo /today.html {% extends "base.html" %} {% block content %} <h1>Things to do today:</h1> <table> {% for item in object_list %} <tr> <td>{{ item.text }}</td> </tr> {% endfor %} </table> {% endblock %}
请注意,我们在这里不需要截止日期,因为此页面仅显示截止日期为今天的待办事项。
我们创建了一个基本模板base.html,其中包含所有常见的 html 标签。index.html和Today.html是子模板,它们继承了公共元素,但具有特定的内容。
我们还需要配置在浏览器中访问今天任务的方式。转到myDjangoProject path("today/", views.TodayToDos.as_view(), name="today")
以urlpatterns
获取以下内容:
from django.urls import path
from . import views
urlpatterns = [
path("", views.AllToDos.as_view(), name="index"),
path("today/", views.TodayToDos.as_view(), name="today")
]
让我们确保一切都按预期进行。转到http://127.0.0.1:8000/admin/并添加几个待办事项,将截止日期设置为今天。然后转到http://127.0.0.1:8000/todo/today/并确保您看到新添加的待办事项:
改善体验
在此阶段,我们的待办事项应用程序将执行其预期的操作:
显示所有待办事项的列表
显示今天应该做什么
允许使用 Django 管理界面添加新任务
但看起来不太好看,使用起来也不是很舒服。让我们解决这个问题!
改善 html 页面外观的最简单方法是实施 CSS。例如,我们可以使用简单的 CSS。打开base.html并将以下行放在<head>
标签之间的任意位置:
<link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css">
在浏览器中访问http://127.0.0.1:8000/todo/查看我们应用程序的新外观:
由于我们使用的是基本模板,因此http://127.0.0.1:8000/todo/today/的外观也会发生变化:
现在让我们添加一些导航元素以避免在浏览器地址栏中输入地址。在base.html中,将以下代码粘贴到开始<body>
标记后:
<div>
<a class="button" href='{% url "index" %}'>All tasks</a>
<a class="button" href='{% url "today" %}'>Today</a>
</div>
结果如下:
测试应用程序
您可能已经注意到,应用程序的“所有任务”页面上的一些待办事项将于 5 月 12 日截止。这些任务实际上已过期,我们不需要显示它们。通过在开发应用程序时引入测试可以避免这种疏忽。
在myDjangoProject/todo目录中,有tests.py文件。它适用于 Django 测试。让我们编写一个测试来检查待办事项是否根据截止日期正确呈现在应用程序的主页上:
from datetime import date, timedelta
from django.test import TestCase
from django.urls import reverse
from .models import ToDoItem
def create_todo(todo_text, days):
return ToDoItem.objects.create(text=todo_text, due_date=date.today() + timedelta(days=days))
class AllToDosViewTest(TestCase):
def test_today(self):
todo = create_todo("To be done today", 0)
response = self.client.get(reverse("index"))
self.assertQuerySetEqual(
response.context["todoitem_list"],
[todo]
)
def test_last_week(self):
todo = create_todo("This task is past due", -7)
response = self.client.get(reverse("index"))
self.assertQuerySetEqual(
response.context["todoitem_list"],
[]
)
def test_next_week(self):
todo = create_todo("Still have some time", 7)
response = self.client.get(reverse("index"))
self.assertQuerySetEqual(
response.context["todoitem_list"],
[todo]
)
这里,create_todo
是一个创建待办事项的快捷函数,AllToDosViewTest
是一个具有 3 个方法的测试类:test_today
, test_last_week
, test_next_week
。每个方法都会创建一个具有相应截止日期的任务,然后检查该任务是否呈现在应用程序的主页上。不应显示截止日期为当前日期前 7 天的任务。
要运行此测试,请在编辑器中右键单击文件tests.py的背景,选择“运行”选项,或者直接按。CtrlShiftF10
测试结果显示在“运行”工具窗口的“测试运行器”选项卡中:
您可以看到test_last_week
失败了,因为创建的待办事项已添加到将显示在主页上的项目列表中,尽管已过期。
让我们通过将get_queryset
方法添加到AllToDos
类来修复它:
def get_queryset(self):
return ToDoItem.objects.filter(due_date__gte=date.today())
该方法将过滤对象,以便视图仅返回那些截止日期大于或等于今天日期(这就是代表的日期__gte
)的任务。
单击“运行”工具窗口的工具栏上的重新运行测试。现在所有测试都成功通过:
概括
本教程就结束了。您已成功创建、启动并测试了一个简单的 Django 应用程序。让我们总结一下您在 PyCharm 的帮助下所做的事情:
使用应用程序创建 Django 项目
启动 Django 服务器
创建模型、视图和模板
配置的网址
启动应用程序
创建并执行测试
感谢您的反馈意见!