模板层

模板层

后端朝前端传递数据

传递方式一:
	return render(request,'index.html',{'n':n})
传递方式二:
	return render(request,'index.html',locals())
	
	后端传函数名到前端,会自动加括号调用,但是不支持传参,所以在前端得到的是一个函数的返回值
	后端传对象到前端,就相当于打印了这个对象。
	前端获取后端传递过来的容器类型的内部元素,统一采用句点符(.)
	例如:(都在{{}}中进行取值,因为是有关变量)
   	列表          a.0    a.2.1支持索引取值 
   	元组		   同上
   	字典		   a.key(支持key取值,value也可以是容器类型,再使用.取值)
   	集合		   无序,不支持索引取值
   	对象		   obj.方法或属性(注意的是,这里的方法可以是不含参数的静态方法,也可以是除了不含其它参数的类方法或对象方法)总而言之,在前端不支持传参
   	
   前端能够调用python后端数据类型的一些不需要传参的内置方法
   
注释:
	1.原生的html注释会展示到前端<!--我是注释-->
	2.模板语法的注释不会展示到前端(#我是注释)

过滤器

1.统计字符串的长度   {{s|length}}
2.前端获取数据如果为空返回默认值,有则返回数据的值{{s|default:'没有值'}}
3.相同的类型(int或字符串)加 {{'haha'|add:'hehe'}}
4.将数字格式化成表示文件大小的单位 {{file_size|filesizeformat}}
5.格式化时间 {{time|date:'Y-m-d'}}
6.字符串的切片操作{{res|slice:'0:8:2'}} #索引0到8,步长为2,不写默认1
7.截取固定长度的字符串
	7.1 {{s|truncatechars:10}}  #截取10位包括省略号(3点),实际其实只有7位
	7.2 {{s|truncatewords:4}}  #取四段,默认空格为界,不包括省略号(3点)
8.前后端取消转义 
	8.1,在前端使用{{ht|safe}},(ht='<h1>hello<h1>') 加上safe就会将ht当做前端语言执行,否则会将其整体转义当做字符串文本
	8.2 在后端导入from django.utils.safestring import mark_safe
		ht=mark_safe(''<h1>hello<h1>'')
	上面两种都可以达到取消转义的目的,(因为自动取消转义会有被脚本攻击的风险)

标签

1.for循环 
	{% for foo in l %}
		<p>{{ foo }}</p>
		<p>{{ forloop }}</p>
        #forloop值为下方的字典  
        {'revcounter':反向序号, 'last'(是否是最后一位,True或者False), 'revcounter0':反向索引, 'counter0':(索引), 'parentloop':引用的父级循环对象没有为{}, 'first': (是否是最后一位,True或者False), 'counter':(序号,从1开始)}
	{% endfor %}
    
2.if判断
	{% if flag %}
    	<p>flag不为空<p>
        {% else %}
        <p>flag为空<p>
    {% endif %}
    
3.if和for的嵌套使用
	{% for foo in l %}
		{% if forloop.first %}
		<p>这是我的第一次</p>
		{% elif forloop.last %}
		<p>这是最后一次了啊</p>
		{% else %}
		<p>嗨起来!!!</p>
		{% endif %}
         {% empty %}    #当for循环对象为空的时候就会走empty代码块的内容,empty要放在循环中
        	<p>你给我的容器类型是个空啊,没法for循环</p>
	{% endfor %}

自定义过滤器

必须做的三件事
	1.在应用名下新建一个名Wietemplatetags文件夹(必须是这个名字)
	2.在该新建的文件夹内新建一个任意名称的py文件
	3.在该py文件下需要固定写两句代码
		from django import template
		register=template.Library()   #名字规定,不能更改
		
1.自定义过滤器
	@register.filter(name='XBB')   
	def index(a,b):     #最多支持两个参数
		return a+b
		#前端调用{% 1|XX:2 %} 把add换成XBB
        
2.自定义标签
	@register.simple_tag
    def puls(a+b+c):
        return a+b+c 
    	#前端调用 {% plus 1 2 3 %}
        
3.自定义inclusion_tag
	@register.inclusion_tag('login.html')
    def login(n):
        l=['第%s项'%i for i in range(n)]
        return {'l':l}
    
    #login.html
    	<ul>
            {% for foo in l %}
            <li>{{ foo }}</li>
            {% endfor %}
        </ul>
        
	#调用 {% login 5 %} 
过程:
	1.调用的时候把参数传入my_tag(定义的py文件)中
	2.执行login函数,将函数的返回值传入装饰器的login.html中
    3.就可以加载这个库中的代码

模板的继承和导入

首先需要在被继承的二模块中划分多个区域
    {% block 给区域起的名字 %}

    {% endblock %}
通常情况下一个模块至少有三块
	{% block css %}
	页面css代码块
    {% endblock %}

    {% block js %}
    页面js代码块
    {% endblock %}

    {% block content %}
    页面主体内容
    {% endblock %}
    
子板继承模板
	先继承模板所有的内容
	{% extends 'home.html' %}
	
	然后根据block块的名字修改指定区域的内容
	{% block content %}
		1.添加内容,就会把继承模板中的{% block content %}内的内容替换
		2.还可以通过{{ block.super }}继续使用主页面某一个块里面的内容
		3.也支持模板的导入:将一段html当做模块的方式导入到另一个html展示
		{% include '想导入的html文件名' %}
	{% endblock %}

静态文件配置

{% load static %}   #先导入
	方法一:
    	<link rel='stylesheet' href="{% static 'css/mycss.css'%}">
     方法二:
    	<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">
posted @ 2019-06-12 20:18  Mr-Bear  阅读(156)  评论(0编辑  收藏  举报