liuweida

内置模板标签

  • 格式 {% %}

  • 注释

    模板注释 {# 内容 #}	注释的所有东西全部隐藏
    html注释 <!--内容-->	#会在页面右键检查中显示
    
  • for

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
    </ul>
    
    • for循环可用的一些参数

      参数 描述
      forloop.counter 当前循环索引值(1开始)
      forloop.counter0 当前循环的索引值(从0开始)
      forloop.revcounter 当前循环的倒序索引值(到1结束)
      forloop.revcounter0 当前循环的倒序索引值(到0结束)
      forloop.first 当前循环是不是第一次循环(布尔值)
      forloop.last 当前循环是不是最后一次循环(布尔值)
      forloop.parentloop 本层循环的外层循环
  • for...empty

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% empty %}
        <li>数据内容不存在</li>
    {% endfor %}
    </ul>
    
    页面显示:数据内容不存在
    
  • if、elif、else

    {% if person_obj.age < 30 %}
    	年龄小
    {% elif person_obj.age == 30% }
    	青年
    {% else person.obj.age > 30 % }
    	中年
    

    if语句支持:>,<,>=,<=,==,!=,and,or,in,not in,is,is not判断

    py:10>5>1--->相当于10>5 and 5>1  True
    js:10>5>1--->相当于10>5 true-->true>1   false
        
    # 模板中不支持连续判断,也不支持算术运算(过滤器代替)
    
  • with:定义一个中间变量

    {% with hobby_list.2.3 as basketball %}
    	{{basketball}}
    {% endfor %}
    
    {% with basketball=hobby_list.2.3 %}
    	{{basketball}}
    {% endfor %}
    
  • csrf_token

    csrf:跨站请求伪造

    在form表单中添加{% csrf_token %}
    打开中间件中的django.middleware.csrf.CsrfViewMiddleware
    

  • autoescape

    控制当前的自动转义行为,此标记以on或off作为参数,并确定自动转义是否在块内生效。该块以endautoescape结束标记关闭。

    {% autoescape on %}
    //写需要转义的内容
    {% endautoescape %}
    
  • 控制转义还可以在py代码中

    from django.utils.safestring import mark_safe
    
    def get_classlist(self):
    	#使用mark_safe函数标记后,django将不再对该函数的内容进行转义
        return mark_safe("<a href=\'#\'>test</a>")
    

过滤器

内置过滤器

  • 语法:{{ value|filter_name:参数 }}

  • default

    {{ value|default:\'nothing\' }}
    # 如果value值没传或者传的是空的话就显示nothing
    {{ xxx|default:\'nothing\' }}	# nothing
    

    :TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:\'找不到\',可以替代default的的作用。

    TEMPLATES = [
        {
            \'BACKEND\': \'django.template.backends.django.DjangoTemplates\',
            \'DIRS\': [os.path.join(BASE_DIR,\'templates\')],
            \'APP_DIRS\': True,
            \'OPTIONS\': {
                \'context_processors\': [
                    .....
                ],
                \'string_if_invalid\':\'找不到\',	# 页面会显示找不到
            },
        },
    ]
    
  • filesizeformat

    将格式转成“人类可读”的文件大小的值。

    {{ value|filesizeformat }}
    {{ xxx|filesizeformat }} # \'xxx\':1024
    # 页面显示 1.0KB
    
  • add

    将参数添加到值

    {{value|add:\'2\'}}	# 将2添加到value
    {{xxx|add:\'2\'}}	# \'xxx\':1024
    {{xxx|add:2}}
    # 页面结果均为:1026
    {{xxx|add:\'2\'}}	# \'xxx\':\'1024\'
    # 页面结果:1026
    {{xxx|add:\'2\'}}	# \'xxx\':\'abc\'
    # 页面结果:abc2
    {{xxx|add:\'abc\'}}	# \'xxx\':1024
    # 页面结果:1024abc
    
    {{xxx|add:yyy}}	# \'xxx\':[\'1\', \'20\', \'3\']  \'yyy\':[\'nihao\', \'20\', \'3\']
    # 页面结果:[\'1\', \'20\', \'3\', \'nihao\', \'20\', \'3\']
    

    过滤器将首先尝试将两个值强制转换为整数。如果失败,它将尝试将值一起添加到一起。这将适用于某些数据类型(字符串,列表等),而对其他数据类型则失败。如果失败,结果将为空字符串。

  • lower:小写

    {{ value|lower }}	
    {{ string|lower }}	# string = \'aBcDe\'
    # 页面结果:abcde
    
  • upper:大写

    {{ value|upper }}	
    {{ string|upper }}	# string = \'aBcDe\'
    # 页面结果:ABCDE
    
  • title:标题

    {{ value|title }}	
    {{ string|title }}	# string = \'aBcDe\'
    # 页面结果:Abcde   将每个单词第一个元素大写
    
  • ljust:左对齐

    {{ value|ljust:"10" }} # 参数:字段大小
    如果value是Django,输出将是。"Django    "
    
  • rjust:右对齐

    {{ value|rjust:"10" }} # 参数:字段大小
    如果value是Django,输出将是。"    Django"
    
  • center:居中

    {{ value|center:"10" }} # 参数:字段大小
    如果value是"Django",输出将是。"     Django    "
    
  • length:返回长度

    {{ value|length }}	
    {{ string|length }}	# string = \'aBcDe\'
    # 页面结果:5  
    
  • slice:切片

    {{value|slice:"2:-1"}}
    {{ string|slice:\'2:-1\' }} # string = \'aBcDe\'
    # 页面结果:cD  
    {{ string|slice:\'-2:0\' }} # string = \'aBcDe\'
    # 无法切出来,方向默认都是从左向右,如果想切出来加步长{{ string|slice:\'-2:0:-1\' }}
    
  • first:取第一个元素

    {{value|first}}
    {{ string|first }} # string = \'aBcDe\'
    # 页面结果:a
    
  • last:取第二个元素

    {{value|last}}
    {{ string|last }} # string = \'aBcDe\'
    # 页面结果:e
    
  • join:字符串拼接列表

    {{ value|join:" // " }}
    <h1>{{ string|join:\'***\' }}</h1>	# string = \'aBcDe\'
    # 页面结果:a***B***c***D***e
    <h1>{{ lis|join:\'***\' }}</h1>
    # 页面结果:1***2***3***nihao
    
  • truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:截断的字符数
    {{ value|truncatechars:9}}	# value = \'asdfghjkl123456\'
    # 页面结果:asdfgh...   三个省略号也占位
    
  • truncatewords

    • 按照单词进行截断 只针对英文单词
  • date:日期格式化

    {{ value|date:"Y-m-d H:i:s"}}	value = datetime.now()
    # 2019-06-18 19:30:31
    
    # setting 中的配置(全局)
    USE_L10N = False
    DATETIME_FORMAT = \'Y-m-d H:i:s\'
    
  • safe

    告诉django不需要转义

    {{ value|safe}}	# value = \'<a href=\'#\'>点我</a>\'
    # 页面结果:点我
    # 转义以后显示<a href=\'#\'>点我</a>
    
  • divisibleby

    如果值可以被参数整除,则返回True

    {{ value|divisibleby:"3" }}
    

自定义过滤器filter

  • {% %}中使用只能用filter,因为里面不能再套{% %},自定义sample_tag和inclusion_tag都不行

  • 给变量用的,传入的参数有限制

  • 在app下创建一个名为templatetags的python包,包名字必须是这个

  • 在python中创建py文件,文件名自定义

  • 进入py文件导入模块

    from django import template 
    register = template.Library()  # register也不能变
    
  • 写函数+装饰器

    @register.filter
    def add_xx(value,arg):	# 最多两个参数  第一个是value,第二个是过滤器参数(非必须,有些过滤器无参数)
        return \'{}-{}\'.format(value,arg)
    
    注:在装饰器可加参数@register.filter(name=\'xxx\'),那么使用时就不能使用函数名了,需要使用xxx这个名字
    
  • 使用

    {% load py文件名 %}	# html文件中先导入py文件
    {{ \'alex\'|add_xx:\'dsb\' }}	# 将alex给到py文件中函数第一个参数,dsb给到第二个参数
    

simple_tag用法

  • 和自定义过滤器(filter)相似,参数不受限制

  • 在app下创建一个名为templatetags的python包,包名字必须是这个

  • 在python中创建py文件,文件名自定义

  • 进入py文件导入模块

    from django import template 
    register = template.Library()  # register也不能变
    
  • 写函数+装饰器

    @register.simple_tag
    def join_str(*args, **kwargs):	# 接收任意个位置参数,任意个关键字参数
        return \'{} - {} \'.format(\'*\'.join(args), \'$\'.join(kwargs.values()))
    
  • 使用

    {% load py文件名 %}	# 在html文件中导入py文件
    {% join_str \'1\' \'2\' k1=\'3\' k2=\'4\' %}	# 将位置参数给到py文件中join_str函数*args,关键字参数给到**kwargs
    

inclusion_tag用法

  • 返回一个HTML代码段,比较灵活,会根据提供的参数进行相应的变化。

  • 典型:分页

  • 在app下创建一个名为templatetags的python包,包名字必须是这个

  • 在python中创建py文件,文件名自定义

  • 进入py文件导入模块

    from django import template 
    register = template.Library()  # register也不能变
    
  • 写函数+装饰器

    @register.inclusion_tag(\'page.html\')	#参数是模板地址,一个HTML代码段 
    def page(num):	# 接收参数
        return {\'num\':range(1,num+1)} # 返回一个字典,将返回值传给模板进行渲染
    
  • 在页面中使用

    {% load my_tags %}	# 调用模板,先导入py文件
    {% page 2 %}	# 将参数传给py文件中的page函数
    

母版与继承

  • 母版:就是一个普通HTML提取多个页面的公共部分,定义block块

    1.将公共部分拿出,单独放于一个HTML文件中,可供子文件调用
    2.在html文件中定义一些block块,可让子文件替换成子页面独有的内容
    如:
    {% block content%}
    
    {% endblock %}
    
  • 继承:

    1.先继承母版 {% extends ‘base.html’ %}
    2.重写block块,替换模板位置的block,显示子页面独有内容
    {% block content%}
    	子页面独有内容
    {% endblock %}
    

    {% extends ‘base.html’ %}

    重写block块-----写子页面独特的内容

    注意事项

    • {% extends \'base.html\' %} 写在第一行 前面不要有内容 有内容会显示
    • {% extends \'base.html\' %} \'base.html\' 加上引号 不然当做变量去查找
    • 把要显示的内容写在block块中
    • 可定义多个block块,定义 css js 块

组件

  • 一小段HTML代码段 ——》 nav.html

  • {% include ‘nav.html ’ %} 导入组件

静态文件

  • {% load static %}和get_static_prefix

    setting文件中STATIC_URL = \'/static/\'

    导入{% load static %},使用以下方式,setting中别名改变,文件中会自动变

    {% load static %}或者{% load staticfiles %}
    
    <link rel="stylesheet" 
    href="{% static \'/plugins/bootstrap-3.3.7/css/bootstrap.css\'%}">
    
    {% get_static_prefix %}   ——> 获取别名
    <link rel="stylesheet" 
    href="{% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css">
    

分类:

技术点:

相关文章: