加了影片搜索的功能之后,就存在没有搜到任何影片的情况。现在的网页上,如果没有搜到,就是没有显示结果。这个不是很直观,最好能有个提示,说没有搜到任何影片。
要实现这个功能,就得知道每次搜索出来的影片信息共有多少条。web.py 对于数据库的功能并没有做很多封装,并不能很方便地通过我们取出的影片数据得到数量。因此,需要再增加一次数据库查询,得到影片的数量。
获取数量的 SQL 语句是:
1 | SELECT COUNT(*) FROM 数据库 WHERE 查询条件; |
web.py 提供了接口:
1 | db.query('SQL语句') |
用来获取数据库查询指定 SQL 语句的结果。
在查询 movies 的代码(class index 的 POST 方法)之后增加一行查询数量的代码:
1 2 3 4 5 6 7 | 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 出每一个中间步骤的结果:
1 2 3 4 5 6 7 | statement = 'SELECT COUNT(*) AS COUNT FROM movie WHERE ' + condition result = db.query(statement) data = result[0] count = data['COUNT'] |
得到影片数量之后,有两种选择,一种是直接在代码中判断,如果数量为 0,就返回另一个没有无结果的页面。另一种是把数量也作为参数传递给模板,让模板在显示的时候进行处理。
这里我选择后一种方法。这样不用再额外增加一个模板页面,而且对于搜索到结果的情况,也可以把数量显示在页面上。
所以,在返回模板时增加一个参数:
1 | return render.index(movies, count) |
同时,在模板 index.html 里处理这个参数:
1 | $def with (movies, count) |
具体显示部分:
1 2 3 4 5 6 7 8 9 10 11 | $if count > 0: <p>共 $count 部影片</p> <p>影片列表:</p> ... $else: <p>啊咧,没能找到符合条件的影片</p> |
现在去搜一个不存在的关键字试试看,已经可以有提示了。
因为默认首页、演员查询、导演查询都用了同一个模板,所以在几处都要做同样的修改,增加 count 值。
既然增加了搜索结果的数量显示,顺手也把该次搜索的关键字给显示出来好了。模板里再增加一个叫 key 的参数:
1 | $def with (movies, count, key) |
在影片数量后面加上关键字:
1 2 3 4 5 6 7 8 9 | <p> 共 $count 部影片 $if key: 与 $key 有关 </p> |
搜索代码在调用模板时提供 key 参数:
1 | return render.index(movies, count, data.title) |
以及演员、导演两处:
1 2 3 4 5 | return render.index(movies, count, cast_name) return render.index(movies, count, director_name) |
对于默认首页,不存在关键字,就传递 None:
1 | return render.index(movies, count, None) |
完成。
做个小小的优化,给 $key 增加两个标签:
1 | 与 <b><u>$key</u></b> 有关 |
这样关键字就被加粗和加下划线了。
本文地址: Python-心中有数
您必须 登录 才能发表评论