设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 20674|回复: 9
打印 上一主题 下一主题

Python 实战(8):心中有数

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2015-6-14 00:16:11 |只看该作者 |倒序浏览
someweb-08.png
加了影片搜索的功能之后,就存在没有搜到任何影片的情况。现在的网页上,如果没有搜到,就是没有显示结果。这个不是很直观,最好能有个提示,说没有搜到任何影片。

要实现这个功能,就得知道每次搜索出来的影片信息共有多少条。web.py 对于数据库的功能并没有做很多封装,并不能很方便地通过我们取出的影片数据得到数量。因此,需要再增加一次数据库查询,得到影片的数量。

获取数量的 SQL 语句是:

SELECT COUNT(*) FROM 数据库 WHERE 查询条件;

web.py 提供了接口:

db.query('SQL语句')

用来获取数据库查询指定 SQL 语句的结果。

在查询 movies 的代码(class index 的 POST 方法)之后增加一行查询数量的代码:

data = web.input()
condition = r'TITLE LIKE "%' + data.title + r'%"'
movies = db.select('movie', where=condition)
count = db.query('SELECT COUNT(*) AS COUNT FROM movie WHERE ' + condition)[0]['COUNT']

AS COUNT 是给查询结果设的别名,为了便于从结果中取值。
注意 WHERE 后面需要留空格,不然会和条件语句连在一起。
[0] 表示从结果里取出第一条,事实上这个查询语句只有一条结果,就是符合条件的数据数量值。
['COUNT'] 则是用设定的别名得到此数值。

这一行代码其实包含了好几条语句,看不明白的话,可以把它分开来,并且 print 出每一个中间步骤的结果:

statement = 'SELECT COUNT(*) AS COUNT FROM movie WHERE ' + condition
result = db.query(statement)
data = result[0]
count = data['COUNT']

得到影片数量之后,有两种选择,一种是直接在代码中判断,如果数量为 0,就返回另一个没有无结果的页面。另一种是把数量也作为参数传递给模板,让模板在显示的时候进行处理。

这里我选择后一种方法。这样不用再额外增加一个模板页面,而且对于搜索到结果的情况,也可以把数量显示在页面上。

所以,在返回模板时增加一个参数:

return render.index(movies, count)

同时,在模板 index.html 里处理这个参数:

$def with (movies, count)

具体显示部分:

$if count > 0:
    <p>共 $count 部影片</p>
    <p>影片列表:</p>
    ...
$else:
    <p>啊咧,没能找到符合条件的影片</p>

现在去搜一个不存在的关键字试试看,已经可以有提示了。

因为默认首页、演员查询、导演查询都用了同一个模板,所以在几处都要做同样的修改,增加 count 值。

既然增加了搜索结果的数量显示,顺手也把该次搜索的关键字给显示出来好了。模板里再增加一个叫 key 的参数:

$def with (movies, count, key)

在影片数量后面加上关键字:

<p>
    共 $count 部影片
    $if key:
        与 $key 有关
</p>

搜索代码在调用模板时提供 key 参数:

return render.index(movies, count, data.title)

以及演员、导演两处:

return render.index(movies, count, cast_name)

return render.index(movies, count, director_name)

对于默认首页,不存在关键字,就传递 None:

return render.index(movies, count, None)

完成。

做个小小的优化,给 $key 增加两个标签:

与 <b><u>$key</u></b> 有关

这样关键字就被加粗和加下划线了。

留一个思考题:如何在页面上显示最近搜索的关键字。

code.py (1.58 KB, 下载次数: 118)
index.html (624 Bytes, 下载次数: 101)



#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

22

积分

新手上路

Rank: 1

沙发
发表于 2015-7-10 12:01:41 |只看该作者
Crossin 先生您好,偷偷跟您学了好久了,现在遇到了一个问题,特来请教:
就是在自己打的HTML模板里,格式要遵循什么样子的法则呢?下载下来您的HTML文件,里面基本上没有换行,全部都是用不太相等的空格隔开的,那到底要用多少个空格呢?
我想自己看的清楚一点,所以换行换的比较勤,以前都能跟上不出问题,但是今天在加入了if函数之后,就有了问题。具体情况给您截图如下:
c:\users\administrator\desktop\1.jpg
c:\users\administrator\desktop\2.png
如图所示,如果去掉模板中if 和 else 前面的$ 符号,页面也是可以正常显示的。但是就是判断语句都显示在了页面中,自然也就没有效果了。一加上$之后就会报错。
尝试用了您的模板,修改了其中的中文之后也是可以正常显示的。(我的模板中不能加中文,好像是转码有问题,这也是想向您请教的一个问题,不过先用英文可以凑活着)
(怕图片挂掉,再加一个图片附件)

1.jpg (56.72 KB, 下载次数: 399)

1.jpg

2.png (21.73 KB, 下载次数: 387)

2.png

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2015-7-10 20:51:07 |只看该作者
风车小奔牛 发表于 2015-7-10 12:01
Crossin 先生您好,偷偷跟您学了好久了,现在遇到了一个问题,特来请教:
就是在自己打的HTML模板里,格式 ...

这个和python语法一样,缩进要保持一致,要么等倍数的空格,要么tab
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

4

积分

新手上路

Rank: 1

地板
发表于 2018-1-3 09:34:02 |只看该作者
说句真心话,crossin老师,是我自学python里,见过的,讲的最通俗易懂的了,自已从2017年10月1到2018年1月3日,断断续续自学了3个月了。到现在仍然感觉python好难,什么时候才能象crossin老师这样,能做到游刃有余呀。。。
回复

使用道具 举报

0

主题

0

好友

24

积分

新手上路

Rank: 1

5#
发表于 2018-12-17 13:48:01 |只看该作者
crossin老师您好,像类似movies = db.select('movie')和data = web.input()里的movies和data怎么print出来?我在程序里加了print(movies)和print(data)这个语句但是运行后看不到打印的结果。麻烦解答一下谢谢!
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2018-12-19 22:57:53 |只看该作者
Stevenchen 发表于 2018-12-17 13:48
crossin老师您好,像类似movies = db.select('movie')和data = web.input()里的movies和data怎么print出来 ...

print的输出是在控制台里的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

24

积分

新手上路

Rank: 1

7#
发表于 2018-12-23 16:35:40 |只看该作者
crossin老师,还是那个问题,我在程序里添加了print,但在控制台还是看不到打印结果,而且运行程序后也无法输入,是什么原因呢?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2018-12-24 22:08:24 |只看该作者
Stevenchen 发表于 2018-12-23 16:35
crossin老师,还是那个问题,我在程序里添加了print,但在控制台还是看不到打印结果,而且运行程序后也无法 ...

可以看下这个视频 http://v.youku.com/v_show/id_XMjc3MzE5MDkyMA==.html
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

9#
发表于 2018-12-29 08:52:04 |只看该作者
这里的功能里面,是不能通过搜索功能来搜索导演,演员的名字,是吗?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2018-12-29 12:51:47 |只看该作者
dashifu7034 发表于 2018-12-29 08:52
这里的功能里面,是不能通过搜索功能来搜索导演,演员的名字,是吗?

对。可以按照同样方法,多加两条数据库查找语句,然后把结果合并到一起
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-21 23:20 , Processed in 0.027202 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部