ListView 学习
今天的目标是想完成我的任务列表功能。ListView可以很好的完成这个功能。它是使用方法非常简单好用。
1 添加TaskView
首先第一步,在views.py中添加TasView继承自ListView
class TaskView(generic.ListView):
template_name = 'task_manager/task.html'
context_object_name = 'latest_task_list'
paginate_by = 10
model = Task
def get_queryset(self):
if 'name' in self.request.GET:
name = self.request.GET['name']
return Task.objects.filter(name__contains = name)
else:
return Task.objects.all()
解释一下这段代码的含义。我们只要设置model就可以和实际的数据库实体进行绑定。这样就可以具备查询数据库的能力了。context_object_name指定页面使用的对象。通过它我们就可以在页上进行渲染了。paginate_by是指分页的大小,10就是一页显示10条记录。template_name用于指定模板。好了。有了这几个属性。就可以完成一个带分页的页面了。get_queryset这个方法是为了实现查询而重写的。如果不带查询的话。这个方法可以不要。我们通过request传过来的name来进行查询。其中contains是like的意思。
2 添加url链接
下面在urls.py中添加链接。用于定位url
url(r'^task$', views.TaskView.as_view(), name='task'),
3 添加模板
<table class="table table-condensed table-bordered">
<tr>
<th>编号</th>
<th>名称</th>
<th>命令</th>
<th>参数</th>
<th>状态</th>
<th>结果</th>
<th>开始</th>
<th>结束</th>
</tr>
{% for task in latest_task_list %}
<tr>
<td>{{ task.id }}</td>
<td>{{ task.name }}</td>
<td>{{ task.cmd }}</td>
<td>{{ task.args }}</td>
<td>{{ task.status }}</td>
<td>{{ task.result }}</td>
<td>{{ task.begin }}</td>
<td>{{ task.end }}</td>
</tr>
{% endfor %}
</table>
<div>
<ul class="pagination">
<li><a href="{{ request.path }}?page=1"><<</a></li>
{% if page_obj.has_previous %}
<li><a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">上一页</a></li>
{% else %}
<li><a>上一页</a></li>
{% endif %}
{% if page_obj.has_next %}
<li><a href="{{ request.path }}?page={{ page_obj.next_page_number }}">下一页</a></li>
{% else %}
<li><a>下一页</a></li>
{% endif %}
<li><a href="{{ request.path }}?page={{ page_obj.paginator.num_pages }}">>></a></li>
</ul>
</div>
说明一下,table部分是用由显示内容的。pagination是分页。
4 效果
好了,有了上面的代码。就完成了这个功能的开发。还是非常好用的。但是在学习这个的过程中也发现了一些问题。dango是一个很好的框架。文档也很全面,但是实际项目和手册还是有一定区别的。没有一个真正项目的学习,很难将这些功能应用好。而市面上的书大部分都是好多年前的了。帮助有但是不大。使用新版本还容易产生奇异,学习开源一直面临这个问题。也不知道有没有什么好的办法。