Python 3零起点教程实战Day 12 - 编写日志列表页
上一篇:Day 11 - 编写日志创建...
下一篇:Day 13 - 提升开发效率
Day 12 - 编写日志列表页
MVVM模式不但可用于Form表单,在复杂的管理页面中也能大显身手。例如,分页显示Blog的功能,我们先把后端代码写出来:
在apis.py
中定义一个Page
类用于存储分页信息:
class Page(object):
def __init__(self, item_count, page_index=1, page_size=10):
self.item_count = item_count
self.page_size = page_size
self.page_count = item_count // page_size + (1 if item_count % page_size > 0 else 0)
if (item_count == 0) or (page_index > self.page_count):
self.offset = 0
self.limit = 0
self.page_index = 1
else:
self.page_index = page_index
self.offset = self.page_size * (page_index - 1)
self.limit = self.page_size
self.has_next = self.page_index < self.page_count
self.has_previous = self.page_index > 1
def __str__(self):
return 'item_count: %s, page_count: %s, page_index: %s, page_size: %s, offset: %s, limit: %s' % (self.item_count, self.page_count, self.page_index, self.page_size, self.offset, self.limit)
__repr__ = __str__
在handlers.py
中实现API:
@get('/api/blogs')
def api_blogs(*, page='1'):
page_index = get_page_index(page)
num = yield from Blog.findNumber('count(id)')
p = Page(num, page_index)
if num == 0:
return dict(page=p, blogs=())
blogs = yield from Blog.findAll(orderBy='created_at desc', limit=(p.offset, p.limit))
return dict(page=p, blogs=blogs)
管理页面:
@get('/manage/blogs')
def manage_blogs(*, page='1'):
return {
'__template__': 'manage_blogs.html',
'page_index': get_page_index(page)
}
模板页面首先通过API:GET /api/blogs?page=?
拿到Model:
{
"page": {
"has_next": true,
"page_index": 1,
"page_count": 2,
"has_previous": false,
"item_count": 12
},
"blogs": [...]
}
然后,通过Vue初始化MVVM:
View的容器是#vm
,包含一个table,我们用v-repeat
可以把Model的数组blogs
直接变成多行的``:
往Model的blogs
数组中增加一个Blog元素,table就神奇地增加了一行;把blogs
数组的某个元素删除,table就神奇地减少了一行。所有复杂的Model-View的映射逻辑全部由MVVM框架完成,我们只需要在HTML中写上v-repeat
指令,就什么都不用管了。
可以把v-repeat="blog: blogs"
看成循环代码,所以,可以在一个`内部引用循环变量
blog。
v-text和
v-attr`指令分别用于生成文本和DOM节点属性。
完整的Blog列表页如下:
参考源码
day-12
上一篇:Day 11 - 编写日志创建...
下一篇:Day 13 - 提升开发效率