• 过滤器,simple_tag,inclusion_tag,模板继承


    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文件,文件可以自定义
    • 不起名称,默认是函数名

    定义

    1. from django import template
    2. register = template.Library()
    3. @register.filter
    4. def fill(value, arg):
    5. return value.replace(" ", arg)
    6. @register.filter(name="addSB")
    7. def add_sb(value):
    8. return "{} SB".format(value)

    使用

    1. # 使用自定义filter
    2. {# 先导入我们自定义filter那个文件 #}
    3. {% load app01_filters %}
    4. {# 使用我们自定义的filter #}
    5. {{ somevariable|fill:"__" }}
    6. {{ d.name|addSB }}

    simple_tag的使用

    介绍

    • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
    • 在templatetags包中创建py文件,文件可以自定义
    • 不起名称,默认是函数名

    定义

    1. from django import template
    2. import datetime
    3. from blog.models import Article
    4. register = template.Library()
    5. # use simple tag to show string
    6. @register.simple_tag
    7. def total_articles():
    8. return Article.objects.filter(status='p').count()
    9. # use simple tag to set context variable
    10. @register.simple_tag
    11. def get_first_article(name='aaa'):
    12. return Article.objects.filter(status='p').order_by('-pub_date')[0]

    使用

    1. # 导入
    2. {% load blog_extras %}
    3. 文章数: {% total_articles %}

    4. {% aaa %}
    5. 第一篇文章:

    6. {{ aaa.title }}

    inclusion_tag

    介绍

    • 在已经注册的app下创建一个python包,包的名字为 templatetags; (包名必须叫这个)
    • 在templatetags包中创建py文件,文件可以自定义

    定义

    1. from django import template
    2. from blog import models
    3. from django.db.models import Count
    4. register=template.Library()
    5. @register.inclusion_tag('left_tag.html')
    6. def left_panel(username):
    7. user_obj = models.UserInfo.objects.filter(username=username).first()
    8. blog = user_obj.blog
    9. # 文章分类
    10. category_article_list = models.Category.objects.filter(blog=blog).annotate(num=Count('article')).values('title', 'num')
    11. # 标签分类
    12. tag_article_list = models.Tag.objects.filter(blog=blog).annotate(num=Count('article')).values('title', 'num')
    13. # 时间分类auth_group
    14. time_archive_list = models.Article.objects.filter(user__username=username).extra(
    15. select={'ym': 'DATE_FORMAT(create_time,"%%Y-%%m")'}
    16. ).values('ym').annotate(num=Count('nid')).values('ym', 'num')
    17. return {
    18. 'username': username,
    19. 'category_article_list': category_article_list,
    20. 'tag_article_list': tag_article_list,
    21. 'time_archive_list': time_archive_list,
    22. }

    left_tag.html

    1. <div class="panel panel-primary">
    2. <div class="panel-heading">
    3. <h3 class="panel-title">文章分类h3>
    4. div>
    5. <div class="panel-body">
    6. <ul class="panel-ul">
    7. {% if not category_article_list %}
    8. <li>没有此分类li>
    9. {% else %}
    10. {% for category_article in category_article_list %}
    11. <li><a href="/blog/{{ username }}/category/{{ category_article.title }}">{{ category_article.title }}({{ category_article.num }})a>li>
    12. {% endfor %}
    13. {% endif %}
    14. ul>
    15. div>
    16. div>
    17. <div class="panel panel-success">
    18. <div class="panel-heading">
    19. <h3 class="panel-title">标签分类h3>
    20. div>
    21. <div class="panel-body">
    22. <ul class="panel_ul">
    23. {% if not tag_article_list %}
    24. <li>没有此分类li>
    25. {% else %}
    26. {% for tag_article in tag_article_list %}
    27. <li><a href="/blog/{{ username }}/tag/{{ tag_article.title }}">{{ tag_article.title }}({{ tag_article.num }})a>li>
    28. {% endfor %}
    29. {% endif %}
    30. ul>
    31. div>
    32. div>
    33. <div class="panel panel-info">
    34. <div class="panel-heading">
    35. <h3 class="panel-title">时间归档h3>
    36. div>
    37. <div class="panel-body">
    38. <ul class="pane_ul">
    39. {% if not time_archive_list %}
    40. <li>没有此分类li>
    41. {% else %}
    42. {% for time_archive in time_archive_list %}
    43. <li><a href="/blog/{{ username }}/archive/{{ time_archive.ym }}">{{ time_archive.ym }}({{ time_archive.num }})a>li>
    44. {% endfor %}
    45. {% endif %}
    46. ul>
    47. div>
    48. div>

    使用

    1. {% load mytag %}
    2. {% left_panel username %}

    模板继承

    介绍

    Django支持模板的继承。你需要使用extends标签。

    模板继承是 Django 模板语言中最强大的部分。模板继承使你可以构建基本的“骨架”模板,将通用的功能或者属性写在基础模板中,也叫基类模板或者父模板。子模板可以继承父类模板,子模板继承后将自动拥有父类中的属性和方,我们还可以在子模板中对父模板进行重写,即重写父模板中方法或者属性,从而实现子模板的定制。模板继承大大提高了代码的可重用性,减轻开发人员的工作量。

    父模板

     新建xxx.html模板文件,在需要替换的不同位置,加上不同名称的block标签

     

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>
    6. {% block title %}
    7. Welcome to
    8. {% endblock title %}
    9. title>
    10. head>
    11. <body>
    12. <p>尊敬的用户您好:p>
    13. <hr>
    14. {% block content %}
    15. <p>这是主体内容可以被子模板重写p>
    16. {% endblock content %}
    17. <hr>
    18. {% block footer %}
    19. <p>这是结尾的内容也可以被重写p>
    20. {% endblock footer %}
    21. body>
    22. html>

    子模板

    1. 在新的子html文件开头写:{% extends "父模板" %}

    2.  接下来重写模板中的block标签内容:

     注意:每个block标签不能同名,可以有多个(一般css/js/内容都可以有)

    {% block content %}

    ……

    {% endblock %}或者{% endblock content %}

    3. 要想继承保留模板block中的内容,在重写时加上

    {{ block.super }}

    1. {% extends 'index/base.html' %}
    2. {% block title %} 欢迎你学习Django教程 {% endblock %}
    3. {% block content %}
    4. {% for item in course %}
    5. <li>{{ item }}li>
    6. {% endfor %}
    7. {% endblock content %}
    8. {% block footer %}<p>最后希望<span style="color:red">{{ name }}span>在C语言中文网学习可以学有所成p>
    9. {% 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 

  • 相关阅读:
    张瑞敏荣登世界管理思想家名人堂
    git命令行学习二
    ApiPost接口测试工具
    Android热修复Sophix的使用
    vue原生实现element上传多张图片浏览删除
    30、同vlan不同网段能否ping通?网络中各种互通与不通的总结分析
    win10系统中同时安装jdk8和jdk14,便于pyhanlp和neo4j的使用。
    LeetCode75——Day12
    Kotlin高仿微信-第11篇-单聊-语音
    SPI 详解
  • 原文地址:https://blog.csdn.net/qq_52385631/article/details/126953030