欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django模板层

程序员文章站 2022-05-04 14:01:33
一.模板语言的变量 views.py html 二.模板的过滤器 过滤器语法: 其他的过滤器 | 过滤器 | 描述 | 示例 | | | | | | upper | 以大写方式输出 | {{ user.name \| upper }} | | add | 给value加上一个数值 | {{ user ......

一.模板语言的变量

views.py

def index(request):
    #模板语言的变量
    name = 'yven'
    addr = false
    age = 180
    li = [1,2,3,4,['a','b','c']]
    dic = {'name':'lyf','age':18,'hobby':['run','play']}
    def test():
        return 'test'

    class mytest():
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def getname(self):
            return self.name
        @classmethod
        def test_cls(cls):
            return 'cls方法'
        @staticmethod
        def static_test():
            return '静态方法'

    from django.utils import safestring
    link1 = '<a href="https://www.baidu.com">点我<a>'
    link1 = safestring.mark_safe(link1)
    mytest = mytest('yven',18)
    import datetime
    now = datetime.datetime.now()
    value = []
    return render(request,'index.html',locals())

html

<h2>模板语言的变量</h2>
<div>
    <p>字符串:{{ name }}</p>
    <p>数字:{{ age }}</p>
    <p>列表:{{ li }}</p>
    <p>列表取值:{{ li.4.1 }}</p>
    <p>字典取值:{{ dic.name }}</p>
    <p>字典:{{ dic }}</p>
    <p>函数:{{ test }}</p>
    <p>对象:{{ mytest.age }}</p>
    <p>对象的类方法:{{ mytest.test_cls }}</p>
    <p>对象的静态方法:{{ mytest.static_test }}</p>
    <p>未被解析的字符串:{{ link1 }}</p>
</div>

二.模板的过滤器

过滤器语法:

{{ obj|filter_name:param }} 变量名|过滤器名:参数
<h2>模板的过滤器</h2>
<div>
    {#  default:如果该变量是false或者为空,使用给定的默认值  #}
    <p>{{ addr|default:'上海' }}</p>
    
    {#  length:返回该变量的长度  #}
    <p>{{ li|length }}</p>
    
    {#  filesizeformat:将值格式化为一个文件尺寸单位  #}
    <p>{{ 1024|filesizeformat }}</p>
    
    {#  date:将事件格式化为自定义的格式  #}
    <p>{{ now|date:'y/m/d' }}</p>
    
    {#  slice:将值按要求切片,可设置步长  #}
    <p>{{ li|slice:'1:-1' }}</p>
    
    {#  truncatechars:字符串多于指定的字符数量,会被截断,自动添加的...也算在指定数量中  #}
    <p>{{ 'abcdefghijklm'|truncatechars:8 }}</p>
    
    {#  truncatewords:字符串词数多于指定的数量,会被阶段,自动添加...不算在指定数量中  #}
    <p>{{ 'abc def ghi jkl m'|truncatewords:3 }}</p>
    
    {#  safe:设置时,如果该值为页面可以解析的语言,就会被识别  #}
    <p>{{ '<a href="#">点我一下</a>'|safe }}</p>
</div>

其他的过滤器

过滤器 描述 示例
upper 以大写方式输出 {{ user.name | upper }}
add 给value加上一个数值 {{ user.age | add:”5” }}
addslashes 单引号加上转义号
capfirst 第一个字母大写 {{ ‘good’| capfirst }} 返回”good”
center 输出指定长度的字符串,把变量居中 {{ “abcd”| center:”50” }}
cut 删除指定字符串 {{ “you are not a englishman” | cut:”not” }}
date 格式化日期
default 如果值不存在,则使用默认值代替 {{ value | default:”(n/a)” }}
default_if_none 如果值为none, 则使用默认值代替
dictsort 按某字段排序,变量必须是一个dictionary {% for moment in moments | dictsort:”id” %}
dictsortreversed 按某字段倒序排序,变量必须是dictionary
divisibleby 判断是否可以被数字整除 {{ 224 | divisibleby:2 }} 返回 true
escape 按html转义,比如将”<”转换为”&lt”
filesizeformat 增加数字的可读性,转换结果为13kb,89mb,3bytes等 {{ 1024 | filesizeformat }} 返回 1.0kb
first 返回列表的第1个元素,变量必须是一个列表
floatformat 转换为指定精度的小数,默认保留1位小数 {{ 3.1415926 | floatformat:3 }} 返回 3.142 四舍五入
get_digit 从个位数开始截取指定位置的数字 {{ 123456 | get_digit:’1’}}
join 用指定分隔符连接列表 {{ [‘abc’,’45’] | join:’’ }} 返回 abc45
length 返回列表中元素的个数或字符串长度
length_is 检查列表,字符串长度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
linebreaks


标签包裹变量

{{ “hi\n\ndavid”|linebreaks }} 返回

hi

david

linebreaksbr
标签代替换行符
linenumbers 为变量中的每一行加上行号
ljust 输出指定长度的字符串,变量左对齐 {{‘ab’|ljust:5}}返回 ‘ab ’
lower 字符串变小写
make_list 将字符串转换为列表
pluralize 根据数字确定是否输出英文复数符号
random 返回列表的随机一项
removetags 删除字符串中指定的html标记 {{value | removetags: “h1 h2”}}
rjust 输出指定长度的字符串,变量右对齐
slice 切片操作, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9] {{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
slugify 在字符串中留下减号和下划线,其它符号删除,空格用减号替换 {{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
stringformat 字符串格式化,语法同python
time 返回日期的时间部分
timesince 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours
timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量
title 每个单词首字母大写
truncatewords 将字符串转换为省略表达方式 {{ 'this is a pen' | truncatewords:2 }}返回``this is ...
truncatewords_html 同上,但保留其中的html标签 {{ '<p>this is a pen</p>' | truncatewords:2 }}返回``<p>this is ...</p>
urlencode 将字符串中的特殊字符转换为url兼容表达方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
urlize 将变量字符串中的url由纯文本变为链接
wordcount 返回变量字符串中的单词数
yesno 将布尔变量转换为字符串yes, no 或maybe {{ true | yesno }}{{ false | yesno }}{{ none | yesno }} ``返回 ``yes``no ``maybe

三.模板的标签

标签看起来像是这样的{% tag %},标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模板中。一些标签需要开始和结束标签

for标签

和python中的for循环类似,遍历每一个元素:

{% for person in person_list%}
    <p>{{ person.name }}</p>
{% endfor %}

tips:可以利用{% for obj in list reversed %}反向完成循环

{{forloop}}

forloop.counter            the current iteration of the loop (1-indexed) 当前循环的索引值(从1开始)
forloop.counter0           the current iteration of the loop (0-indexed) 当前循环的索引值(从0开始)
forloop.revcounter         the number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始)
forloop.revcounter0        the number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始)
forloop.first              true if this is the first time through the loop 当前循环是不是第一次循环(布尔值)
forloop.last               true if this is the last time through the loop 当前循环是不是最后一次循环(布尔值)
forloop.parentloop         本层循环的外层循环

for..empty..

for标签的一个可选的从句({% empty %}),以便在给出的组是空的或者没有被找到时,可以有所操作

{% for person in person_list%}
    <p>{{ person.name }}</p>
{% empty %}
    <p>no this one</p>
{% endfor %}

if标签

同样与python中的if语句类似,会对一个变量进行判断,如果它的值为true,对应的内容块会输出.

该标签支持and、or、==、>、<、>=、<=、!=、in、not in、is、is not判断

<div>
    {% if age > 90  %}
        <p>老大</p>
    {% elif age > 50 and age < 90 %}
        <p>老二</p>
    {% else %}
        <p>小弟</p>
    {% endif %}
</div>

with标签

使用一个简单地名字缓存一个复杂的变量名,相当于取别名

<div>
    {% with business.employees.count as a %}
        {{ a }}
    {% endwith %}
</div>

四.自定义标签和过滤器

自定义标签和过滤器的前提:
1.在settings中installed_apps配置当前app,不然django无法找到自定义的simple_tag
2.在app中创建templatetags模块(模块名只能是templatetags)
3.在templatetags中创建任意.py文件.

mytag.py文件

# 1.导入template
from django import template

# 2.定义一个交register的变量  赋值template.library()
register = template.library()

# 3 自定义过滤器和标签
@register.filter(name='lyf')
def str_add(str1, str2):
    return str1 + str2

@register.simple_tag()
def add_nb(value):
    return value+'nb'

使用自定过滤器和标签

需要在使用前加{% load py文件名%}

<h1>自定义过滤器</h1>
{% load mytag %}
{{ 'yven'|lyf:'666' }}

<h1>自定义标签</h1>
{% add_nb 'yven' %}

注意:filter可以用在if等语句后,simple_tag不可以

{% if 'yven'|lyf:'666' %}
    {{ 'yven'|lyf:'666' }}
{% endif %}