django模板&过滤器

声明:部分信息来源这篇博客https://www.cnblogs.com/maple-shaw/articles/9333821.html

MVC:

  • 模型(model)-------->模型
  • 视图(view)----->html
  • 控制器(controller)--------->业务逻辑
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

Django的MTV模式

  • M:(model)模型ORM
  • T:(templates)模板
  • V:(view)业务逻辑
   Model(模型):负责业务对象与数据库的对象(ORM)Template(模版):负责如何把页面展示给用户View(视图):负责业务逻辑,并在适当的时候调用Model和Template此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
  • Django框架图示

django模板

  • 只有两种特殊符号

    {{变量}}
    {% 逻辑 %}如for循环等
  • 注意:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

    1. 在字典中查询
    2. 属性或者方法
    3. 数字索引

Filters过滤器

Filters过滤器

  • https://docs.djangoproject.com/en/1.11/ref/templates/language/#filters django官方文档

  • https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#ref-templates-builtins-filters django过滤器官方文档1

  • 用来修改变量在html的显示结果

  • 语法

    语法: {{ 变量(或者字符串等等)|方法名:参数 }}#:前后不可以有空格default默认值过滤器
    {{ 变量|default:"nothing"}}#如果value值没传的话就显示设置的默认值nothing
    注:在setting.py中TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。filesizeformat文件尺寸过滤器
    {{ 变量|filesizeformat }}#将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等),最大支持单位pBadd
    {{ 变量|add:"2" }}#给变量加参数,相当于py中的加号,可以数字运算,字符串拼接,列表拼接lower
    {{ 变量|lower }}#小写upper
    {{ 变量|upper}}#大写title
    {{ 变量|title }}#标题ljust
    {{ 变量|ljust:"10" }}#左对齐rjust
    {{ 变量|rjust:"10" }}#右对齐center
    {{ 变量|center:"15" }}#居中length
    {{ 变量|length }}#变量长度slice
    {{变量|slice:"2:-1"}}#切片first
    {{ 变量|first }}#取第一个元素last
    {{ 变量|last }}#取最后一个元素join
    {{ 变量|join:" // " }}#使用字符串拼接列表。同python的str.join(list)。truncatechars
    {{ 变量|truncatechars:9}}#如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。date
    {{ 变量|date:"Y-m-d H:i:s"}}#日期格式化safe
    假如value = "<a href='#'>点我</a>"
    {{ 变量|safe}}#Django的模板为了安全会对HTML标签和JS等语法标签进行自动转义,safe能取消django的转义{% widthratio 100; 1 100%}#先除后乘,需要三个参数
    

自定义filter(过滤器)

  • 在app下创建一个名为templatetags的python包;

  • 在python中创建py文件,文件名自定义(my_tags.py);

  • 在my_tags.py文件中配置

    from django import template#导入模块register = template.Library() #标准语句都不能改#写函数装饰器
    @register.filter
    def add_xx(value, arg):  # 最多有两个
    return '{}-{}'.format(value, arg)#返回两个值的拼接#在html使用方式
    {% load my_tags %}#引用模块
    {{ 'alex'|add_xx:'dsb' }}#通过函数名使用@register.filter(name = xxx)#可以直接通过name等于的xxx取引用
    def add_xx(value, arg):  # 最多有两个
    return '{}-{}'.format(value, arg)#返回两个值的拼接#在html使用方式
    {% load my_tags %}#引用模块
    {{'alex'|xxx:'dsb'}}#通过赋值的name引用
  • 自定义过滤器只是带有一个或两个参数的Python函数:

    • 变量(输入)的值 - -不一定是一个字符串
    • 参数的值 - 这可以有一个默认值,或完全省略
  • 例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”

Tags标签

  • divisibleby方法可除尽,除尽True,不然False

for循环

  • for语法

    <ul>
    {% for user in user_list %}<li>{{ user.name }}</li>
    {% endfor %}
    </ul>
  • for循环的参数
Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(到1结束)
forloop.revcounter0 当前循环的倒序索引值(到0结束)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环
  • for... empty

    {% for book in all_books %}<tr>.....</tr>
    {% empty %}<td colspan="5" style="text-align: center">没有相关的数据</td>{% endfor %}

if判断

  • dango的if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

  • django的if与python的区别

    python  10>5>1  -->   10>5  and 5>1   true django     10>5>1  -->   10>5  --> true   -->   1>1  false
    • 模板中 不支持连续连续判断 也不支持算数运算(过滤器)
  • 模板的if&elif&else实例

    {% if user_list %}
    用户人数:{{ user_list|length }}
    {% elif black_list %}
    黑名单数:{{ black_list|length }}
    {% else %}
    没有用户
    {% endif %}
    • 当然也可以只有if和else了!!!!

with定义变量

  • with定义一个中间变量,在django模板中有些值,需要多次使用,我们就可以通过with定义变量,方便使用

    {% with total=business.employees.count %}
    {#将business.employees.count值定义为total可以在语句内使用#}{{ total }} employee{{ total|pluralize }}
    {% endwith %}
    {#结束with语句#}

csrf_token

  • csrf_token标签用于跨站请求伪造保护。(django的保护机制为了防止post请求是从其他端发送来的,需要一个认证,直接发送,会报403错误,加入这个标签代表加入了认证方法,就能够在django中发送post请求了)

  • 在页面的form表单里面写上{% csrf_token %}

    <form>{#在form表单中加入这个标签,不用注释中间件也可以发送(接收)post请求了#}
    {% csrf_token %}
    </form>

注释

  • {# 注释内容 #}

    {#注释内容#}单行注释,多行就是多敲几遍

注意事项

    1. Django的模板语言不支持连续判断,即不支持以下写法:

      {% if 10 > 5 > 1 %}
      ...
      {% endif %}
    1. Django的模板语言中属性的优先级大于方法
    • 如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中:
    {{ data.items }}
    • 默认会取d的items key的值。

母板

  • 在我们使用django中,往往有很多页面的代码效果重复(公用)的,这是如果网页格式有新变动,我们就需要一个个修改每个html的模板,这个工作起来不仅费时,还会占用一定不必要的资源,这时我们就需要像面向对象的继承思想学习,将公用的放在一个统一的html文件中,其他文件继承这个html文件,这个文件我们就称为母板
  • 注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

  • 子页面继承母版,方便使用母版的样式

    • 在子页面中在页面最上方使用下面的语法来继承母板
    {% extends '母板.html' %}
    {#输入这个语句就可以继承母版.html的样式 #}{#通过在母板中使用{% block  xxx %}来定义"块"。
    在子页面中通过定义母板中的block名来对应替换母板中相应的内容。如果不在定义的块中则不会出现效果#}注意在母版中需要定义一个块,子网页的中数据写一个块,名称要与母版的块名相同才能替换{#实例,下面就是我们在继承母版的子页面,定义的块中,输入几条语句#}
    {% block page-main %}
    <p>世情薄</p>
    <p>人情恶</p>
    <p>雨送黄昏花易落</p>
    {% endblock %}

组件

  • 组件与母版类似,不同的是,母版比较大,不经常变动,而在网页中我们有些是需要灵活变动的,这时候我们就需要组件来帮忙了,组件本质也是继承一个文件,不同的是组件是较少代码的继承

  • 继承组件语法

    {% include '组件.html' %}

静态文件(模板标签)

  • 在我们一般时候中,需要对静态文件设置一个别名,才可以使用静态文件中的文件等,可如果出现,别名被改动,我们就需要去html中一个个修改文件导入的名称,这样不够,于是django替我们想到了这个情况,我们可以通过下面几种模板标签方式,避免这种问题

    方式一
    {% load static %}
    {#导入static方法#}
    <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
    {#{% static "images/hi.jpg" %}中的static代表着我们的静态文件别名,可以随着我们的修改动态的变化#}方式二
    {#使用get_static_prefix#}
    {% load static %}
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
    {#get_static_prefix代表当前的静态文件别名,与路径拼接即可,不过不如方式一方便,不经常使用#}

simpletag(自定义模板标签)

  • 和自定义filter类似,只不过能够接收更灵活的参数。

    实例
    定义注册simple tag@register.simple_tag(name="plus")
    def plus(a, b, c):return "{} + {} + {}".format(a, b, c)#将传进来的参数进行拼接返回在模板中使用
    {% load app01_demo %}
    {% plus "1" "2" "abc" %}

inclusion_tag(自定义返回html代码)

  • 在网页中我们模板有些样式是需要跟着服务端的数据,灵活变动的,这时我们就需要通过服务端动态的给模板返回html代码,这种方式就是inclusion_tag

  • 动态返回分页数实例:

    • 组件
    <nav aria-label="Page navigation"><ul class="pagination"><li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>{% for i in num %}<li><a href="#">{{ i }}</a></li>{% endfor %}<li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li></ul>
    </nav>
    • 模板
    {% load my_tags %}
    {% page 2 %}
    {#使用inclusion_tag#}
    • inclusion_tag,配置信息
    @register.inclusion_tag('page.html')#返回值返回的页面
    def page(num):return {'num': range(1, num + 1)}#返回的数据
    • 实现网页引用这个方法,根据方法后面传入数字的值,显示多少分页

    好了,django模板的东西就说到这了,其他没有说到或遗漏的的,博客内有django的官网,大家可以去官网具体了解学习

转载于:https://blog.51cto.com/11985686/2411148

django模板过滤器相关推荐

  1. Django模板过滤器详解

    Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...

  2. Django模板过滤器 、日期格式化、数学运算

    Django 的模板中的数学运算 前言 django模板只提供了加法的filter,没有提供专门的乘法和除法运算: django提供了widthratio的tag用来计算比率,可以变相用于乘法和除法的 ...

  3. django模板_Django模板

    django模板 In this tutorial, we'll learn what is Django Templates. We'll later implement them in a sim ...

  4. django自定义过滤器及模板标签

    django自定义过滤器及模板标签 文件路径配置: 某个app特有的 -app 目录下,新建templatetags 文件夹 -再到 templatetags 文件夹下创建python模块(py文件) ...

  5. Django从理论到实战(part21)--自定义模板过滤器

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  6. Python+django网页设计入门(18):自定义模板过滤器

    前导课程: Python+django网页设计入门(17):模板语法及应用 Python+django网页设计入门(16):优化设计复用分页代码 Python+django网页设计入门(15):公用模 ...

  7. 20190325 Django自定义过滤器和自定义模板标签

    代码布局(死去活来) 自定义要先解决几个问题: 1). 在哪里定义,要将代码写在哪里? app目录下的名为templatetags的文件夹,必须叫这个名字.这个文件夹必须是一个python的包(pyt ...

  8. Django框架学习20--模板变量,模板标签,模板过滤器及自定义模板过滤器,自定义模板标签

    1.模板变量 string 字符串和 int 类型,通过key名称直接取值,如:{{ n_name }} list类型的取值,通过点下班取值,如:{{ fancy.0 }}.{{ fancy.1 }} ...

  9. Python一亿以内的素数个数_Python+django网页设计入门(18):自定义模板过滤器

    前导课程: Python+django网页设计入门(17):模板语法及应用 Python+django网页设计入门(16):优化设计复用分页代码 Python+django网页设计入门(15):公用模 ...

最新文章

  1. 随机模拟【1】:随机模拟的研究范围与特征
  2. 【杂谈】计算机视觉在人脸图像领域的十几个大的应用方向,你懂了几分?
  3. 下取整函数的含义_Excel将3.14159取值为3.15或3.1415? 两个函数为你效劳,拿走不谢...
  4. 我使用过的Linux命令之curl - 强大的网络传输工具
  5. 成为Java流大师–第1部分:创建流
  6. 文本标点符号在前面怎么改_这三个标点符号,为什么写错的人越来越多?
  7. html5 2015,2015年有用的16大免费的响应式HTML5框架
  8. Java多线程学习五:哪些场景需要额外注意线程安全问题及多线程也可能引起性能问题
  9. jq ajax购物车,jquery制作的移动端购物车效果完整示例
  10. java tostring apache,Java如何使用Apache Commons Lang ToStringBuilder类?
  11. 如何使用光盘启动计算机,电脑如何设置光驱启动 电脑设置光驱启动方法【图文】...
  12. 苹果设邮箱的126服务器,Mac系统中的邮箱创建126邮箱帐户的方法
  13. flink集成springboot案例_集成-Apache Flink+Spring Boot
  14. 7-3 学生成绩录入及查询 (20分)__C++
  15. html+圆角六边形,CSS3 圆角六边形
  16. LSC LensShading Correct
  17. 使用ST-LINK下载遇到的连接错误
  18. 4 个 Linux 技巧,你值得拥有
  19. Rasa课程、Rasa培训、Rasa面试系列之 Rasa对话式 AI 网络研讨会回顾
  20. 让log中的关键词过滤的酷炫

热门文章

  1. 简述电子计算机的用途和特点_计算机基础试题及答案
  2. 转让app后AppStore应用名称下面所有者显示问题
  3. UE4编译专用服务器
  4. ios腾讯云文件服务器,使用axios 上传文件到腾讯云
  5. 广州Robotaxi铁三角又落地,文远知行商业化通行证摊牌
  6. 英特尔杀入游戏显卡市场:3000元档位,支持光追和AI超分辨率,挑战AMD英伟达...
  7. 探测器扎堆火星,毅力号:谁挡我WiFi了!
  8. 英特尔“包抄”英伟达:oneAPI对标CUDA、为《王者荣耀》云游戏提供GPU
  9. 马斯克公布火星太空船最新照片:施工已达最后一步,10月有望正式推出
  10. 世界AI大会三马纵论:马云乐观、马斯克悲观,马化腾认为技术孤立主义有大危害...