这篇教程我们一起来完成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)