Django2实战示例 第三章 扩展博客功能

Django2实战示例 第一章 创建博客应用
Django2实战示例 第二章 增强博客功能
Django2实战示例 第三章 扩展博客功能
Django2实战示例 第四章 创建社交网站
Django2实战示例 第五章 内容分享功能
Django2实战示例 第六章 追踪用户行为
Django2实战示例 第七章 创建电商网站
Django2实战示例 第八章 管理支付与订单
Django2实战示例 第九章 扩展商店功能
Django2实战示例 第十章 创建在线教育平台
Django2实战示例 第十一章 渲染和缓存课程内容
Django2实战示例 第十二章 创建API
Django2实战示例 第十三章 上线

第三章 扩展博客功能

在上一章里,使用了基本的表单提交数据与处理表单,进行复杂的分组查询,还学习了集成第三方应用。

这一章涵盖如下的内容:

自定义模板标签和模板过滤器

给站点增加站点地图和订阅功能

使用PostgreSQL数据库实现全文搜索

1自定义模板标签和过滤器

Django提供很多内置的模板标签和过滤器,例如{% if %}或{% block %},在之前已经在模板中使用过它们。关于完整的内置模板标签和过滤器可以看https://docs.djangoproject.com/en/2.0/ref/templates/builtins/。

Django也允许你创建自已的模板标签,用来在页面中进行各种操作。当你想在模板中实现Django没有提供的功能时,自定义模板标签是一个好的选择。

1.1自定义模板标签

Django提供下边的两个函数可以简单快速地创建自定义模板标签:

simple_tag: 处理数据并且返回字符串

inclusion_tag: 处理数据并返回一个渲染的模板

所有的自定义标签,只能够在模板中使用。

在blog应用目录里新建一个目录templatetags,然后在其中创建一个空白的__init__.py,再创建一个文件blog_tags.py,文件结构如下:。

blog/ __init__.py models.py ... templatetags/ __init__.py blog_tags.py

注意这里的命名很关键,一会在模板内载入自定义标签的时候就需要使用这个包的名称(templatetags)。

先创建一个简单的标签,在刚刚创建的blog_tags.py里写如下代码:

from django import template from ..models import Post register = template.Library() @register.simple_tag def total_posts(): return Post.published.count()

我们创建了一个标签返回已经发布的文章总数。每个模板标签的模块内需要一个register变量,是template.Library的实例,用于注册自定义的标签。然后创建了一个Python函数total_posts,用@register.simple_tag装饰器将其注册为一个简单标签。Django会使用这个函数的名称作为标签名称,如果想使用其他的名称,可以通过name属性指定,例如@register.simple_tag(name=\'my_tag\')。

在添加了新的自定义模板标签或过滤器之后,必须重新启动django服务才能在模板中生效。

在模板内使用自定义标签之前,需要使用{% load %}在模板中引入自定义的标签,像之前提到的那样,使用创建的包的名字作为load的参数。

打开blog/templates/base.html模板,在最上边添加{% load blog_tags %},然后使用自定义标签{% total_posts %},这个模板最后看起来像这样:

{% load blog_tags %} {% load static %} <!DOCTYPE html> <html> <head> <title>{% block title %}{% endblock %}</title> <link href="{% static "css/blog.css" %}"> </head> <body> <div> {% block content %} {% endblock %} </div> <div> <h2>My blog</h2> <p>This is my blog. I\'ve written {% total_posts %} posts so far.</p> </div> </body> </html>

启动站点然后到:8000/blog/,应该可以看到总文章数被显示在了侧边栏:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsdsd.html