1. 介绍
过滤器:最多两个参数,第一个为自动传入的,第二个为自己的(可以省略)
simple_tag:加强版的过滤器,参数无限制
inclusion_tag:公共的模板,或者动态展示模板数据,推荐使用
simple_tag (简单标签 : 处理数据,返回一个字符串或者给context设置或添加变量。
inclusion_tag (包含标签) : 处理数据,返回一个渲染过的模板。
- 加上不同的装饰器作用不同
- 装饰器为filter,参数最多只能是两个
- 装饰器为simple_tag和inclusion_tag,参数不受限制
- filter 和 simple_tag 返回值比较直接,直接写在调用的部分
- inclusion_tag 返回值为字典,字典中夹杂变量,变量要交给模板中做渲染,最后输出到调用的地方
- 在html中调用方式不同
- filter 调用语法为 { { }},这种调用语法是可以写在if判断 等语句中
- filter 和 simple_tag 调用语法为 {% %} ,这种不能用于if判断等语法中
1. 过滤器
内置
过滤器 | 例子 |
lower, upper | { { article.title | lower }} 大小写 |
length | { { name | length }} 长度 |
default | { { value | default: "0" }} 默认值 |
date | { { picture.date | date:"Y-m-j" }} 日期格式 |
dicsort | { { value | dicsort: "name" }} 字典排序 |
escape | { { title | escape }} 转义 |
filesizeformat | { { file | filesizeformat }} 文件大小 |
first, last | { { list | first }} 首或尾 |
floatformat | { { value | floatformat }} 浮点格式 |
get_digit | { { value | get_digit }} 位数 |
join | { { list | join: "," }} 字符连接 |
make_list | { { value | make_list }} 转字符串 |
pluralize | { { number | pluralize }} 复数 |
random | { { list | random }} 随机 |
slice | { { list | slice: ":2" }} 切 |
slugify | { { title | slugify }} 转为slug |
striptags | { { body | striptags }} 去除tags |
time | { { value | time: "H:i" }} 时间格式 |
timesince | { { pub_date | timesince: given_date }} |
truncatechars | { { title | truncatechars: 10 }} |
truncatewords | { { title | truncatewords: 2 }} |
truncatechars_html | { { title | truncatechars_html: 2 }} |
urlencode | { { path | urlencode }} URL转义 |
wordcount | { { body | wordcount }} 单词字数 |
自定义
介绍
- 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
- 在templatetags包中创建py文件,文件可以自定义
- 不起名称,默认是函数名
定义
from django import template
register = template.Library()
@register.filter
def fill(value, arg):
return value.replace(" ", arg)
@register.filter(name="addSB")
def add_sb(value):
return "{} SB".format(value)
使用
# 使用自定义filter
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}
{# 使用我们自定义的filter #}
{
{ somevariable|fill:"__" }}
{
{ d.name|addSB }}
simple_tag的使用
介绍
- 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
- 在templatetags包中创建py文件,文件可以自定义
- 不起名称,默认是函数名
定义
from django import template
import datetime
from blog.models import Article
register = template.Library()
# use simple tag to show string
@register.simple_tag
def total_articles():
return Article.objects.filter(status='p').count()
# use simple tag to set context variable
@register.simple_tag
def get_first_article(name='aaa'):
return Article.objects.filter(status='p').order_by('-pub_date')[0]
使用
# 导入
{% load blog_extras %}
<p>文章数: {% total_articles %}</p>
{% aaa %}
<p>第一篇文章: </p>
<p>{
{ aaa.title }}</p>
inclusion_tag
介绍
- 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
- 在templatetags包中创建py文件,文件可以自定义
定义
from django import template
from blog import models
from django.db.models import Count
register=template.Library()
@register.inclusion_tag('left_tag.html')
def left_panel(username):
user_obj = models.UserInfo.objects.filter(username=username).first()
blog = user_obj.blog
# 文章分类
category_article_list = models.Category.objects.filter(blog=blog).annotate(num=Count('article')).values('title', 'num')
# 标签分类
tag_article_list = models.Tag.objects.filter(blog=blog).annotate(num=Count('article')).values('title', 'num')
# 时间分类auth_group
time_archive_list = models.Article.objects.filter(user__username=username).extra(
select={'ym': 'DATE_FORMAT(create_time,"%%Y-%%m")'}
).values('ym').annotate(num=Count('nid')).values('ym', 'num')
return {
'username': username,
'category_article_list': category_article_list,
'tag_article_list': tag_article_list,
'time_archive_list': time_archive_list,
}
left_tag.html
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">文章分类</h3>
</div>
<div class="panel-body">
<ul class="panel-ul">
{% if not category_article_list %}
<li>没有此分类</li>
{% else %}
{% for category_article in category_article_list %}
<li><a href="/blog/{
{ username }}/category/{
{ category_article.title }}">{
{ category_article.title }}({
{ category_article.num }})</a></li>
{% endfor %}
{% endif %}
</ul>
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">标签分类</h3>
</div>
<div class="panel-body">
<ul class="panel_ul">
{% if not tag_article_list %}
<li>没有此分类</li>
{% else %}
{% for tag_article in tag_article_list %}
<li><a href="/blog/{
{ username }}/tag/{
{ tag_article.title }}">{
{ tag_article.title }}({
{ tag_article.num }})</a></li>
{% endfor %}
{% endif %}
</ul>
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">时间归档</h3>
</div>
<div class="panel-body">
<ul class="pane_ul">
{% if not time_archive_list %}
<li>没有此分类</li>
{% else %}
{% for time_archive in time_archive_list %}
<li><a href="/blog/{
{ username }}/archive/{
{ time_archive.ym }}">{
{ time_archive.ym }}({
{ time_archive.num }})</a></li>
{% endfor %}
{% endif %}
</ul>
</div>
</div>
使用
{% load mytag %}
{% left_panel username %}
模板继承
介绍
Django支持模板的继承。你需要使用extends标签。
模板继承是 Django 模板语言中最强大的部分。模板继承使你可以构建基本的“骨架”模板,将通用的功能或者属性写在基础模板中,也叫基类模板或者父模板。子模板可以继承父类模板,子模板继承后将自动拥有父类中的属性和方,我们还可以在子模板中对父模板进行重写,即重写父模板中方法或者属性,从而实现子模板的定制。模板继承大大提高了代码的可重用性,减轻开发人员的工作量。
父模板
新建xxx.html模板文件,在需要替换的不同位置,加上不同名称的block标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--区域1默认区域不可以被子模板修改-->
<title>
{% block title %}
Welcome to
{% endblock title %}
</title>
</head>
<body>
<p>尊敬的用户您好:</p>
<hr>
<!--区域2可以被子模板重写-->
{% block content %}
<p>这是主体内容可以被子模板重写</p>
{% endblock content %}
<hr>
<!--区域3可以被子模板重写-->
{% block footer %}
<p>这是结尾的内容也可以被重写</p>
{% endblock footer %}
</body>
</html>
子模板
1. 在新的子html文件开头写:{% extends "父模板" %}
2. 接下来重写模板中的block标签内容:
注意:每个block标签不能同名,可以有多个(一般css/js/内容都可以有)
{% block content %}
……
{% endblock %}或者{% endblock content %}
3. 要想继承保留模板block中的内容,在重写时加上
{ { block.super }}
{% extends 'index/base.html' %}
<!--重写title-->
{% block title %} 欢迎你学习Django教程 {% endblock %}
<!--区域1保持父模板默认状态-->
<!--对父模板的区域2进行重写-->
{% block content %}
{% for item in course %}
<li>{
{ item }}</li>
{% endfor %}
{% endblock content %}
{% block footer %}<p>最后希望<span style="color:red">{
{ name }}</span>在C语言中文网学习可以学有所成</p>
{% endblock footer %}
参考文章
(15条消息) Django自定义过滤器_stu_xujin的博客-CSDN博客
Django 自定义过滤器、simple_tag、inclusion_tag、mark_safe - Star-Hitian - 博客园 (cnblogs.com)
(15条消息) django中的simpletag和inclusion-tag_qq_26914391的博客-CSDN博客
Django基础篇 06-Django模板过滤器Filter和标签Tags - 捞铁 - 博客园 (cnblogs.com)
(15条消息) Django模版语言inclusion_tag的用法。_miaoqinian的博客-CSDN博客_inclusion_tag