html模板

母版 

1. tags 标签   {%  %}
   for循环      

    {% for name in name_list %}
      {{ name }}
    {% endfor %}

    

    {% for name in name_list %}
      {{ name }}

    {% empty %}      # 当列表中内容为空时执行的语句
      空空如也
    {% endfor %}

    forloop {}  是个字典
      forloop.counter     当前循环的索引值 从1开始
      forloop.counter0    当前循环的索引值 从0开始
      forloop.revcounter     当前循环的索引值 (倒叙) 到1结束
      forloop.revcounter0   当前循环的索引值 (倒叙) 到0结束
      forloop.first        当前循环是否是第一次循环 布尔值
      forloop.last          当前循环是否是最后一次循环 布尔值
      forloop.parentloop    当前循环的外层循环 ——》{}

  if 判断

    {% if 条件 %}    
     操作
    {% endif %}

    

    {% if 条件 %}
         操作
    {% elif 条件 %}
        不同的操作
    {% else %}
       其他操作
    {% endif %}

    注意的事项:
      1. django模板语言不支持连续的判断 a>b>c and连接
      2. 不支持算数运算 +-*/ 使用过滤器      

      3. Django的模板语言中属性的优先级大于字典的方法           

      def xx(request):
          d = {"a": 1, "b": 2, "c": 3, "items": "100"}
          return render(request, "xx.html", {"data": d})
      我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中{{ data.items }}默认会取d的items key的值

  {% with 变量 as 别名 %}   或   {% with  别名 = 变量%}
    {{ 别名 }}
  {% endwith %}

  

  {{ 变量名 }}

  变量名由字母数字和下划线组成。

  点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

  注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:  

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

  过滤器  filters

      

过滤器
1. 语法
	{{ 变量名|filter:参数 }}   注意: '|'左右没有空格
2. 内置的filter
	add:参数     		加  数字相加 字符串拼接 列表拼接	{{ value|add:"2" }}
	default:参数		变量不存在或者为空  显示默认值      {{ value|default:"nothing"}}    如果value值没传的话就显示nothing
	filesizeformat      人性化显示文件大小,将文件大小转化成kb PB          {{ value|filesizeformat }}
	upper				大写
	lower				小写
	title				首字母大写
	ljust:20			左对齐		{{ value|ljust:"20" }}  将变量放在20byte长度中对20个字符进行左对齐
	rjust:20			右对齐
	center:20			居中
	length				长度   		{{ value|length }}   返回value的长度
	slice:'::'			切片		{{value|slice:"2:-1"}}  	列表切片
	join:'_'			拼接列表
	first				取第一个元素
	last				取最后一个元素
	safe				取消对HTML代码的转义
	date:'Y-m-d H:i:s'  日期的格式化	{{ value|date:"Y-m-d H:i:s"}}
	truncatechars:18    文本上的时候进行截断   按18截断
				

  


2. 母版和继承
    1. 母版
        就是一个普通的HTML文件,提取多个页面的公共部分
        减少代码量  修改十分方便        
        在html中定义block块 
         {% block page-main %}   page-main是给这个block起的名字
         ...    				 block块中的内容是其他继承这个母版页面可以修改的
         {% endblock %}        
    2. 使用(继承)
        在子页面中
            {% entends 'base.html' %}   继承母版
            {% block page-main %}
            ... 					重新修改block块中的内容,替换母版中的block
            {% endblock %}            
    3. 注意事项:
        1. 把{% extends 'base.html' %} 写在第一行
        2. 修改的内容写在block中,写在外面不显示
        3. {% extends name %}   name应该是变量 或者是字符串  继承母版的名字
        4. 母版中定义多个block块,一般还有 js 块 和 css块        
    
3. 组件
    1. 就是一小段HTML代码   多个页面都用到的内容 nav.html
    2. 在任意的模板中使用
        {% include 'nav.html' %}           
4. 静态文件相关
    1. {% load staticfiles %} 或者 {% load static %}
    2. {% static 'css/pub.css' %}  ——》 先去settings中获取STATIC_URL的配置,和后面提供的参数进行拼接,推荐这种方式
    
    1. {% load static %}
    2. {% get_static_prefix %}  获取settings中静态文件的路径的前缀,然后作为字符串进行拼接
    
5. 自定义simpletag和自定义inclusion_tag
    1. 在app下创建一个名叫templatetags的python包
    2. 在templatetags里建一个py文件
    3. 在py文件中编辑:
        from django import template
        register = template.Library()
                
        @register.simple_tag
        def join_str(arg1, arg2, arg3,*args,**kwargs):
            print(args)
            print(kwargs)
            return '_'.join([arg1, arg2, arg3])+'*'.join(args)
            
        @register.inclusion_tag('pagination.html')
        def pagination(total, current):
            return {'total': range(1, total + 1), 'current': current}
4.使用 {% load py文件名 %} {% 函数名 参数1 参数2 %}
# 自定义filter文件位置
app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        mytags.py  # 建一个存放自定义filter的py文件,自己起个名字
    views.py

# ----myfilters.py文件
from django import template

register = template.Library()

# 自定义filter给过滤器起名字
@register.filter(name='dsb')
def add_sb(value, arg):   # value是变量名(views中传入html的字典key),arg是传入的参数,name是过滤器的名字
    return "{}_{}_sb".format(value, arg)

# 自定义filter
@register.filter
def add_sb(value, arg):
    return "{}_{}_sb".format(value, arg)

# 自定义simple_tag
@register.simple_tag	# simple_tag和filter类似,但是可以接收多个参数,filter只能接收一个参数
def join_str(arg1, arg2, arg3,*args,**kwargs):    # 类似于filter,simple_tag也可以起名字
    print(args)
    print(kwargs)
    return '_'.join([arg1, arg2, arg3])+'*'.join(args)

# 自定义inclusion_tag
@register.inclusion_tag('pagination.html')
def pagination(total, current):
	return {'total': range(1, total + 1), 'current': current}	
	
----------------------------------------------------------------------------	
	
# -----templates下的html文件,模板	
#使用自定义filter
{% load mytags %}
{{ name1|dsb:'very' }}   # 'name1'是views中render传入的字典的key,接收变量, '|'是管道符, 'dsb'是过滤器的名字 ,'very'是传入的参数


#使用自定义的simple_tag
{% load mytags %}
{% join_str "1" "2" "abc" %}

#使用自定义的inclusion_tag
{% load mytags %}
{% pagination 10 5 %}


#inclusion_tag使用的片段html ,pagination.html,分页然后选中某一页
<div class="text-center">
    <nav aria-label="...">
        <ul class="pagination">
            <li class="disabled"><a href="#" aria-label="Previous"><span
                    aria-hidden="true">«</span></a>
            </li>
            {% for num in total %}
                {% if num == current %}
                    <li class="active"><a href="#">{{ num }}</a></li>
                {% else %}
                    <li><a href="#">{{ num }}</a></li>
                {% endif %}

            {% endfor %}
            <li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li>
        </ul>
    </nav>
</div>

  

 


原文地址:https://www.cnblogs.com/perfey/p/9671750.html