这篇教程我们一起来完成Django2个人博客系统首页相关的代码编写。
首先,根据我们系统结构,首页包含的数据内容是所有文章的列表。
那么,我们可以使用通用视图中的列表视图。
这里需要注意的问题是文章要按编号倒序排列,这样新发布的文章才会在列表首位出现。
示例代码:
from django.shortcuts import render from django.views.generic import ListView from .models import * # Create your views here. class Index(ListView): model = Article template_name = 'index.html' queryset = Article.objects.all().order_by('-id') # 获取到全部文章并按编号降序排列。
不过还没有结束,如果文章很多的话,肯定需要分页功能。
这里我们使用Django自带的分页功能,使用起来非常的简单。
在“Index”代码中我们再添加一行。
示例代码:
paginate_by = 5 # 设置分页时每页的文章数量
这样,我们就开启了分页的支持。
然后,我们进行URL配置。
示例代码:
from django.contrib import admin from django.urls import path from blog import views as blog_view urlpatterns = [ path('', blog_view.Index.as_view()), path('admin/', admin.site.urls), ]
接下来,我们就可以创建首页的模板内容了。
示例代码:(index.html)
{% extends 'base.html' %} <!--从基本模板扩展--> {% block title %}首页{% endblock %} <!--首页标题--> {% block content %} <!--重写内容块--> {% for article in page_obj.object_list %} <!--从分页的对象列表中遍历文章--> <div class="panel panel-default"> <!--显示文章的面板--> <div class="panel-heading"> <!--面板的头部--> <h3 class="panel-title"> <!--放置内容标题--> <a href="{% url 'detail' article.id %}">{{ article.title }}</a> </h3> </div> <div class="panel-body"> <!--面板的主体--> <p>作者:{{ article.author }} 日期:{{ article.pub_time }}</p> <p>{{ article.content|truncatechars:200|striptags }}</p> <!--过滤器用于仅显示200字符和去除HTML标签--> <a class="btn" href="{% url 'detail' article.id %}">进入阅读 »</a> </div> </div> {% endfor %} {% endblock %}
提示:上方代码中“truncatechars”也可以使用“truncatechars_html”,能够将被截断的HTML标签去除。
这里大家要注意一点。
因为,我们对数据内容做了分页设置,所以,在模板中我们不能直接遍历“object_list”,而是要遍历分页的页面对象“page_obj”中的“object_list”。
这样,我们页面上才会只显示一页的内容。
那么,如何进行翻页呢?
我们需要在模板中添加分页条功能。
不过,分页条功能不是首页独有的,例如搜索结果页和分类结果页也都是文章列表,同样需要分页条。
对于这种情况,我们就可以把分页条这个模块,单独做成模板,在需要的页面中去“include”。
提示:在PyCharm中,分页条的代码可以现在首页模板“index.html”中进行编辑后,再复制到分页条模板“paginator.html”文件中。因为,我们数据内容关联的是首页模板,直接在分页条模板中编写代码没有联想提示,不是特别方便。
示例代码:(paginator.html)
<ul class="pagination"> {% if page_obj.has_previous %} <!--如果有前一页--> <li><a href="/?page={{ page_obj.previous_page_number }}">«</a></li> <!--链接到前一页页码--> {% else %} <li class="disabled"><a>«</a></li> <!--否则禁用前一页按钮--> {% endif %} {% for page_number in paginator.page_range %} <!--遍历页码范围--> {% if page_number != page_obj.number %} <!--如果页码与当前页页码不相同--> <li><a href="/?page={{ page_number }}">{{ page_number }}</a></li> <!--生成页码并添加链接--> {% else %} <li class="active"><a>{{ page_number }}</a></li> <!--否则,呈现激活样式--> {% endif %} {% endfor %} {% if page_obj.has_next %}<!--如果有下一页--> <li><a href="/?page={{ page_obj.next_page_number }}">»</a></li> <!--链接到下一页页码--> {% else %} <li class="disabled"><a>»</a></li> <!--否则禁用下一页按钮--> {% endif %} </ul>
在上方的代码中,需要注意的是分页的链接为“/?page=页码”的格式。也就是说链接中需要添加名为“page”的参数。
最后,我们将写好的分页条模板,包含到首页的页面中。
示例代码:index.html
...省略部分代码... {% endfor %} <!--分页条--> {% include 'paginator.html' %} {% endblock %}
上方代码中,红色部分是新增代码。
到这里,我们就完成了首页的全部功能。
转载请注明:魔力Python » Django2练习项目:开发个人博客系统(5)