最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Django2练习项目:开发个人博客系统(5)

Django教程 小楼一夜听春语 10401浏览 0评论

这篇教程我们一起来完成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 }}">&laquo;</a></li> <!--链接到前一页页码-->
    {% else %}
        <li class="disabled"><a>&laquo;</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 }}">&raquo;</a></li> <!--链接到下一页页码-->
    {% else %}
        <li class="disabled"><a>&raquo;</a></li> <!--否则禁用下一页按钮-->
    {% endif %}
</ul>

在上方的代码中,需要注意的是分页的链接为“/?page=页码”的格式。也就是说链接中需要添加名为“page”的参数。

最后,我们将写好的分页条模板,包含到首页的页面中。

示例代码:index.html

    ...省略部分代码...
    {% endfor %}
    <!--分页条-->
    {% include 'paginator.html' %}
{% endblock %}

上方代码中,红色部分是新增代码。

到这里,我们就完成了首页的全部功能。

转载请注明:魔力Python » Django2练习项目:开发个人博客系统(5)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (13)

  1. 头像
    小楼我不知道怎么处理报错,问题出在这个代码 {{ article.title }} NoReverseMatch at / Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.
    走路爱走神7年前 (2018-06-13)回复
    • 头像
      a href="{% url 'detail' article.id %}">{{ article.title }}</a
      走路爱走神7年前 (2018-06-13)回复
      • 头像
        已解决。^^ 多亏楼主写的详细!
        走路爱走神7年前 (2018-06-13)回复
        • 头像
          请问您是怎么解决的呀,我找了好久搞不懂这url是什么
          蒸锅6年前 (2018-08-21)回复
  2. 头像
    a href="{% url 'detail' article.id %}">{{ article.title }}</a
    走路爱走神7年前 (2018-06-13)回复
  3. 头像
    楼主能不能让我看一下你的完整url代码?我不知道怎么处理这个报错
    走路爱走神7年前 (2018-06-13)回复
  4. 头像
    报错了 不知道怎么解决TAT nav.html line 31: Django Error during template rendering In template E:\jy\myblog\blog\templates\nav.html, error at line 31 Reverse for 'category' not found. 'category' is not a valid view function or pattern name.
    yuki6年前 (2018-06-28)回复
    • 小楼一夜听春语
      检查urls和views
      小楼一夜听春语6年前 (2018-06-28)回复
    • 头像
      我也遇到了,不知道怎么解决 ❓
      冷水泡茶6年前 (2018-07-31)回复
  5. 头像
    楼主,请问站内搜索有文章,首页没有文章是什么问题?
    dong6年前 (2019-01-05)回复
  6. 头像
    分页条paginator.html不好用。“/page=...”在分类文章列表页和搜索结果页不正常。当点击其它页时会自动执行index视图函数
    小新6年前 (2019-01-15)回复
  7. 头像
    你好,请问这个有托管到github 上吗,可以看看源码吗?
    BigBao6年前 (2019-01-24)回复
    • 小楼一夜听春语
      源码文末有下载,在第11部分。
      小楼一夜听春语6年前 (2019-01-24)回复