8.2 书籍详情页面
1.业务逻辑梳理
书籍详情页面,首先应该展示数据详情信息。
书籍详情页面应该有加入心愿清单和赠送此书的功能
书籍详情页面默认展示想要赠书次数的人,并且可以向他们索要书籍
如果用户点击了赠送此书,那么他就成了一个赠书人,这个时候书籍详情页面会展示出想要这本书的人
2.编写思路
书籍详情页面接受一个isbn作为参数,直接访问我们之前编写的yushu_book的search_by_isbn函数即可。这需要我们在之前的BookViewModel中加入isbn属性
search_by_isbn返回的原始数据不应该直接返回,而应该经过裁剪加工,这里也可以复用我们之前写的BookViewModel。
BookViewModel需要接受一个book对象,由于search_by_isbn只会返回只有一个对象的列表,所以我们返回结果的第一个元素即可
但是yushu_book.books[0]的写法并不是很好的编程规范,我们之所以可以这么写是因为我们清楚的内部结构,但是我们写的代码不一定是给我们自己用,给被人用的时候要让被人清晰易懂,所以这里,我们在yushu_book加入一个first函数返回第一个对象。
3.实现代码
web/book.py
@web.route("/book/<isbn>/detail")
def book_detail(isbn):
yushu_book = YuShuBook()
yushu_book.search_by_isbn(isbn)
book = BookViewModel(yushu_book.first)
return render_template("book_detail.html", book=book, wishes=[], gifts=[])
spider/yushu_book.py
@property
def first(self):
return self.books[0] if self.total >= 1 else None
view_models/book.py
class BookViewModel:
def __init__(self, data):
self.title = data['title']
self.author = '、'.join(data['author'])
self.binding = data['binding']
self.publisher = data['publisher']
self.image = data['image']
self.price = '¥' + data['price'] if data['price'] else data['price']
self.isbn = data['isbn']
self.pubdate = data['pubdate']
self.summary = data['summary']
self.pages = data['pages']
@property
def intro(self):
intros = filter(lambda x: True if x else False,
[self.author, self.publisher, self.price])
return ' / '.join(intros)
Last updated
Was this helpful?