过滤器:最多两个参数,第一个为自动传入的,第二个为自己的(可以省略)
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判断等语法中
| 过滤器 | 例子 |
| 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 }}
- 在已经注册的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 %}
-
-
-
文章数: {% total_articles %}
-
-
-
- {% aaa %}
第一篇文章:
{{ aaa.title }}
-
- 在已经注册的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,
- }
- <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标签
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
-
- <title>
-
- {% block title %}
-
- Welcome to
-
- {% endblock title %}
-
- title>
- head>
- <body>
-
- <p>尊敬的用户您好:p>
- <hr>
- {% block content %}
- <p>这是主体内容可以被子模板重写p>
- {% endblock content %}
- <hr>
- {% 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' %}
- {% block title %} 欢迎你学习Django教程 {% endblock %}
- {% 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