静态资源和Ajax请求
我们尝试实现一个投票应用,具体的需求是用户进入应用首先查看到“学科介绍”页面,该页面显示了一个学校所开设的所有学科;通过点击某个学科,可以进入“老师介绍”页面,该页面展示了该学科所有老师的详细情况,可以在该页面上给老师点击“好评”或“差评”,但是会先跳转到“登录页”要求用户登录,登录成功才能投票;对于未注册的用户,可以在“登录页”点击“新用户注册”进入“注册页”完成用户注册,注册成功后会跳转到“登录页”,注册失败会获得相应的提示信息。
准备工作
从上面对投票应用需求的描述中我们可以分析出三个业务实体:学科、老师和用户。学科和老师之间通常是一对多关联关系(一个学科有多个老师,一个老师通常只属于一个学科),用户因为要给老师投票,所以跟老师之间是多对多关联关系(一个用户可以给多个老师投票,一个老师也可以收到多个用户的投票)。首先修改应用下的models.py文件来定义数据模型,先给出学科和老师的模型。
1 | from django.db import models |
模型定义完成后,可以通过“生成迁移”和“执行迁移”来完成关系型数据库中二维表的创建,当然这需要提前启动数据库服务器并创建好对应的数据库,同时我们在项目中已经安装了PyMySQL而且完成了相应的配置,这些内容此处不再赘述。
1 | (venv)$ python manage.py makemigrations vote |
vote为models对应文件名
注意:为了给vote应用生成迁移,需要先修改Django项目的配置文件settings.py,在INSTALLED_APPS中添加vote应用。
完成模型迁移之后,我们可以通过下面的SQL语句来添加学科和老师测试的数据。
1 | INSERT INTO `tb_subject` (`no`,`name`,`intro`) |
当然也可以直接使用Django提供的后台管理应用来添加学科和老师信息,这需要先注册模型类和模型管理类。
1 | from django.contrib import admin |
接下来,我们就可以修改views.py文件,通过编写视图函数先实现“学科介绍”页面。
1 | def show_subjects(request): |
至此,我们还需要一个模板页
1 |
|
在上面的模板中,我们为每个学科添加了一个超链接,点击超链接可以查看该学科的讲师信息,为此需要再编写一个视图函数来处理查看指定学科老师信息。
1 | def show_teachers(request): |
显示老师信息的模板页。
1 |
|
加载静态资源
在上面的模板页面中,我们使用了标签来加载老师的照片,其中使用了引用静态资源的模板指令{% static %},要使用该指令,首先要使用{% load static %}指令来加载静态资源,我们将这段代码放在了页码开始的位置。在上面的项目中,我们将静态资源置于名为static的文件夹中,在该文件夹下又创建了三个文件夹:css、js和images,分别用来保存外部层叠样式表、外部JavaScript文件和图片资源。为了能够找到保存静态资源的文件夹,我们还需要修改Django项目的配置文件settings.py,如下所示:
1 | # 此处省略上面的代码 |
接下来修改urls.py文件,配置用户请求的URL和视图函数的对应关系。
1 | from django.contrib import admin |
启动服务器运行项目,进入首页查看学科信息。
点击学科查看老师信息。
Ajax请求
接下来就可以实现“好评”和“差评”的功能了,很明显如果能够在不刷新页面的情况下实现这两个功能会带来更好的用户体验,因此我们考虑使用Ajax技术来实现“好评”和“差评”
首先修改项目的urls.py文件,为“好评”和“差评”功能映射对应的URL。
1 | from django.contrib import admin |
设计视图函数praise_or_criticize来支持“好评”和“差评”功能,该视图函数通过Django封装的JsonResponse类将字典序列化成JSON字符串作为返回给浏览器的响应内容。
1 | def praise_or_criticize(request): |
修改显示老师信息的模板页,引入jQuery库来实现事件处理、Ajax请求和DOM操作。
1 | <script src="{% static 'js/jquery.min.js' %}"></script> |
到此为止,这个投票项目的核心功能已然完成