【Python】Django自定义模板过滤器(选择器)

 

Django内置的过滤器用法:

    {{ 变量名 | 过滤器 }}

虽然Django内置了许多常用的过滤器,但总有些特殊情况需要我们自己定义过滤器,于是Django提供了三大自定义过滤器类型。

分别是:sinple_tag、inclusion_tag、filter

使用自定义过滤器前提,你的app必须已经在settings中注册,如图:

【Python】Django自定义模板过滤器(选择器)_第1张图片

我在article的文件夹下建立自定义过滤器文件,首先必须保证article已经注册过了。


建立一个templatetags文件夹(这个名称不可更改),然后在此文件夹下建一个__init__.py和article_tags.py(这个名称可自定义)文件。其中__init__.py里面可什么也不写,article_tags.py文件用来自定义过滤器逻辑。

【Python】Django自定义模板过滤器(选择器)_第2张图片


simple_tag用来对传送过来的变量进行简单处理

inclusion_tag用来对传送的变量进行HTML标签包裹,返回HTML片段

filter对传送来的数据流进行过滤处理

用法:

from django import template
register = template.Library()

引入template模块,创建register对象,以@方式注册自定义模板函数。图中该函数主要用来查询ArticlePost库的文章总数

@register.simple_tag
def total_articles():
    return ArticlePost.objects.count()

在对应的HTML文件中引用自定义标签:

{% load article_tags %}

这里已经有{% total_articles %}篇文章供您阅读

效果:

inclusion_tag的用法:

inclusion_tag主要用来生成HTML片段插入到原来的节点中,所以一般需要自定义一个视图模板,

数据会经过latest_articles函数处理,处理之后return给article/list/latest_articles.html这个自定义视图渲染。

@register.inclusion_tag('article/list/latest_articles.html')
def latest_articles(n=5):
    latest_articles = ArticlePost.objects.order_by('-created')[:n]
    return {'latest_articles':latest_articles}

 latest_articles.html

{% for article in  latest_articles %}
    
{% endfor %}

上图主要是遍历出最新的5篇文章,然后交给视图渲染成超链接的HTML片段。

{% load article_tags %}

最新文章

{% latest_articles 4 %}

同样进行调用,其中的4是所传参数。

效果:

【Python】Django自定义模板过滤器(选择器)_第3张图片

filter的用法:

其用法与上面差不多,只不过更多的用在数据流中,比如有时候我们想要将markdown格式的文本渲染到HTML页面,而不被HTML给转义。

@register.filter(name='markdown')   # 注册自定义过滤器,命名为markdown
def markdown_filter(text):
    return mark_safe(markdown.markdown(text))       # markdown模块将markdown语法转化为HTML,mark_safe函数将string转化实实在在的字符串,不转义

marrkdown模块是第三方包,需要pip安装,mark_safe()是Django自带的方法,避免html的转义。

filter的name参数用于给自定义的过滤器命名

{% load article_tags %}

{{ article.body | markdown }}

将文章内容转化为markdown格式,并显示在页面上。

效果:

【Python】Django自定义模板过滤器(选择器)_第4张图片

 

有用的话请给点个赞~

 

你可能感兴趣的:(学习心得)