如何为Django网站开发创建视图
引言
如果你一直跟随我们的Django开发系列,你已经成功创建了一个Django应用程序,允许具有管理员权限的用户通过Django的管理界面仪表板添加评论和帖子。你还通过利用MySQL和Django的对象关系映射解决方案模型来设置了数据持久性。
在本教程中,我们将创建Django视图,使我们的Web应用程序能够正确处理Web请求并返回所需的Web响应。根据Django文档的定义,Web响应可以是Web页面的HTML内容、重定向或HTTP错误(例如404)。视图函数的代码在项目中可以放置在任何位置,只要它在Python路径上即可。然而,关于命名和放置包含这些视图函数的文件,有一些流行的约定惯例,我们将遵循这些做法。
完成本教程的步骤后,您的Django博客网站将会从您的IP地址或域名的/post URL中提取最新的文章。
先决条件
这个教程是 Django 开发系列的一部分,也是该系列的延续。
如果你没有跟着这个系列的话,我们做出以下的假设:
- You have Django version 4 or higher installed.
- You have connected your Django app to a database. We are using MySQL, and you can achieve this connection by following part two of the Django series, “How To Create a Django App and Connect it to a Database.”
- You are working with a Unix-based operating system, preferably an Ubuntu 22.04 cloud server as this is the system we have tested on. If you would like to set up Django on a similar environment, please refer to our tutorial, “How To Install Django and Set Up a Development Environment on Ubuntu 22.04.
- You have set up your Django Admin Interface. You can accomplish this by following our Django Admin tutorial.
由于本指南主要涉及Django视图,即使您的设置有些不同,您也可能能够跟随进行。
第一步 – 创建视图功能
在终端中,首先需要进入相关的目录并激活你的Python虚拟环境。如果你一直在跟随这个系列,你可以输入下面的命令。在开发应用程序时,使用Python编程环境非常重要,以确保你的代码是独立的,并且你的设置是正确的。
- cd ~/my_blog_app
- . env/bin/activate
现在您的虚拟环境已经激活,请进入博客网站目录,在那里打开一个Python文件并创建我们的第一个视图函数。
- cd ~/my_blog_app/blog/blogsite
用nano或您选择的文本编辑器打开views.py文件进行编辑。
- nano views.py
当打开文件时,应该填入类似于以下的代码。
from django.shortcuts import render
# Create your views here.
我们将保留从django.shortcuts库导入render()函数的导入语句。render()函数允许我们将模板和上下文结合在一起,以便返回适当的HttpResponse对象。记住这一点,因为对于我们编写的每个视图,我们都负责实例化、填充和返回HttpResponse。
接下来,我们将添加我们的第一个视图,以欢迎用户进入首页。我们将从Django的http库中导入HttpResponse()函数。使用该函数,我们将传入要在网页请求时显示的文本。
~/my_blog_app/blog/blogsite/views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello, welcome to the index page.')
随后,我们将添加一个功能,该功能将显示我们稍后在教程中要创建的个别帖子。
~/my_blog_app/blog/blogsite/views.py
...
def individual_post(request):
return HttpResponse('Hi, this is where an individual post will be.')
我们最终的views.py文件现在将如下所示。
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return HttpResponse('Hello, welcome to the index page.')
def individual_post(request):
return HttpResponse('Hi, this is where an individual post will be.')
当你完成文件编辑后,一定记得保存并退出。在nano编辑器中,你可以按下CTRL和X键,然后按下Y键,最后按下回车键。
现在,这些功能没有指定的URL,所以我们需要将其添加到我们的URL模式块中的URL配置文件中。添加了视图之后,让我们通过此配置文件将URL映射到它们,以便我们可以查看我们创建的页面。
第二步 – 将URL映射到视图
通过使用Django,我们可以设计自己的URL与我们的应用程序配合使用。这是通过使用一种通常被称为URLconf或“URL配置”文件的纯Python文件来完成的。
为了能够显示网页,Django首先需要确定要使用的根URLconf模块,然后查找包含所有URL模式的urlpatterns列表数据结构。然后,Django逐个查找每个URL模式,直到找到与之匹配的第一个模式。找到匹配的模式后,Django会找到相关联的视图,并将该视图函数接收到与URL模式和HttpRequest对象相关的数据。如果在整个过程中任何地方出现故障,则会显示一个错误处理视图。
在这一部分中,我们将使用我们应用程序中的两个不同目录下的两个不同的urls.py文件进行操作。
在~/my_blog_app/blog/blogsite目录中,打开urls.py文件,也就是你的URLconf文件,进行编辑。我们将使用nano来编辑该文件。
- nano urls.py
修改该文件,使其与下面的文件相同,包括urlpatterns列表。
~/我的博客应用程序/博客/博客站点/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('post/', views.individual_post, name='individual_post')
]
当您完成添加上述行之后,请保存并关闭文件。
一旦我们更新了博客网站目录的URLconf文件,我们将将其包括在博客目录的URLconf中,否则它将不被识别。我们需要这样做是因为在我们的设置文件中将其设置为ROOT_URLCONF。这意味着Django会查看博客目录的URLconf来匹配URL模式。
要在我们的博客URLconf中包含我们的博客站点URLconf,我们需要导航到该目录。
- cd ~/my_blog_app/blog/blog
一旦您到达那里,您可以用nano或者您选择的另一种文本编辑器打开URLconf文件。
- nano urls.py
在这个文件中,我们将添加以下行来包含我们刚刚处理过的/blogsite/urls.py文件,该文件在第二行中指示。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blogsite.urls'))
]
保存并关闭文件。
现在让我们打开一个网络浏览器,以便导航到我们创建的URL并验证它们是否显示了我们添加到视图中的文本。我们需要进入上级目录来访问服务Django应用程序的manage.py文件。
- cd ..
请执行以下命令。您可以在下面将0.0.0.0替换为您的IP地址。
- python manage.py runserver 0.0.0.0:8000
在您的网页浏览器中,导航到您的IP地址,端口8000。
your-server-ip:8000
你将会收到一个类似以下网页的页面。 (Nǐ jiāng huì shōudào yīgè lèisi yǐxià wǎngyè de yèmiàn.)
接下来,导航到以下网址:
your-server-ip:8000/post/
从这里开始,应该显示以下网页。
我们现在已经验证了两个urls.py文件可以工作,而且数据完全符合我们的预期。有了这个基础,让我们在我们的博客中添加一些真实数据。
步骤三—创建博客文章
既然你已经理解URL模式和视图的基本原理,让我们添加一篇博客文章,并在网页上显示出来,而不是硬编码到Python文件中的文本。
我们将通过之前设置的管理员页面创建一篇帖子。在您的服务器上使用浏览器访问Django应用的管理员博客网页,网址为:
your-server-ip:8000/admin/blogsite/
在界面上,点击位于帖子行中的+添加链接,以示例博客文章开始填充数据库。
点击链接后,您将收到一个如下所示的输入表格:
每当你想要添加一篇帖子时,你会前往这个页面进行添加。另外,你也可以通过点击“修改”链接来编辑帖子。
在表单中,您将能够编辑以下字段:
Field | Content |
---|---|
Title |
Add your desired blog post title here, for example My First Blog Post . |
Slug |
This refers to the part of a URL which identifies a valid web address element with human-readable keywords. This is generally derived from the title of the page, so in this case we can use my-first-blog-post . |
Content |
This is the body of your blog post. We will just be adding Hello, World! for example purposes, but this is where you can be verbose. |
Author |
In this field, add your relevant name or username. We will use User01 . |
根据您的测试需求自行填写博客文章表单。
一旦您添加了示例数据到页面上,点击保存按钮。您会收到以下的确认页面:
恭喜!你成功创建了第一篇博客文章!
接下来,让我们验证一下是否已向MySQL数据库添加了包含我们刚刚在管理员界面输入的数据的一行。
第四步 — 显示数据库数据
在这一点上,我们需要转入MySQL,因此通过终端输入CTRL + C停止当前的服务器进程,然后打开MySQL解释器。我们Django应用程序数据库的用户是djangouser,但请确保为您的项目使用正确的用户。
- mysql -u djangouser
一旦进入MySQL提示符,切换到blog_data数据库(或适合你的项目的数据库)。
- use blog_data;
然后显示博客网站文章表的内容。
- select * from blogsite_post;
您将收到类似以下的输出,此输出会显示您在管理用户界面中添加的信息。
Output+----+--------------------+--------------------+---------------+----------------------------+--------+
| id | title | slug | content | created_on | author |
+----+--------------------+--------------------+---------------+----------------------------+--------+
| 1 | My First Blog Post | my-first-blog-post | Hello, World! | 2020-05-14 00:30:03.186564 | User01 |
+----+--------------------+--------------------+---------------+----------------------------+--------+
1 row in set (0.00 sec)
如输出所示,有一行包含我们添加的帖子的数据。现在让我们将这些数据引用到帖子的视图函数中。使用CTRL + D退出MySQL解释器。
导航到你的博客网站应用程序中的views.py文件所在位置。
- cd ~/my_blog_app/blog/blogsite
现在打开文件,我们可以将新数据包含进去。
- nano views.py
把文件编辑成与下面的文件相同。
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post
def index(request):
return HttpResponse('Hello, welcome to the index page.')
def individual_post(request):
recent_post = Post.objects.get(id__exact=1)
return HttpResponse(recent_post.title + ': ' + recent_post.content)
在上面的代码中,我们添加了一个额外的导入语句来引入Post。我们还从HttpResponse中删除了引号字符串,并用我们博客帖子的数据代替它。要引用特定对象的数据,我们使用与我们希望显示的对象相关联的博客帖子ID,并将该ID存储在名为recent_post的变量中。然后,我们可以通过在字段后附加一个句点分隔符来获取该对象的特定字段。
一旦您保存并关闭文件,导航到manage.py文件所在的位置来运行Django应用程序。
- cd ~/my_blog_app/blog
- python manage.py runserver 0.0.0.0:8000
从网页浏览器中,前往以下地址:
your-server-ip:8000/post/
这里,我们将会看到我们所做的更改;页面将与此相似,展示你添加到帖子中的文本。
当您完成查看页面之后,在终端中按下CTRL + C来终止进程运行。
要停用您的编程环境,您可以输入“deactivate”命令,然后退出服务器。
结论
在本教程中,我们创建了视图,映射了URL模式,并从我们的博客文章数据库中显示了文本。
下一个教程将详细介绍如何使用HTML创建Django模板,从而使其更具审美效果。到目前为止,这个系列已经涵盖了Django模型和Django视图。模板是构建Django应用程序基础的最后关键部分。