• Django中模板简单使用


    内置模板标签

    • 格式 {% %}

    • 注释

      模板注释 {# 内容 #}	注释的所有东西全部隐藏
      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">
      
  • 相关阅读:
    《构建之法》第8、9、10章 读后感
    [团队项目]SCRUM项目6.0 7.0 (新)
    [团队项目]SCRUM项目5.0
    [团队项目]SCRUM项目4.0
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    [操作系统]实验三 进程调度模拟程序
    [团队项目] Scrum 项目 2.0 产品BACKLOG
    复利计算的总结
    复利/单利计算程序进度0321更新
    0312 复利计算器2.0 运行与介绍
  • 原文地址:https://www.cnblogs.com/liuweida/p/12302745.html
Copyright © 2020-2023  润新知