django模板层

模板层

后端朝前端页面传递数据的方式

# 第一种
return render(request, "index.html", {"n":n})
# 第二种
return render(request, "index.thml", locals())  # 将当前名称空间中的所有变量都传递给前端页面

前端接收值的方式

{{ 变量名 }}
注意:
	后端传函数名到前端,会自动加括号调用,得到函数的返回值,但是不支持传参
	后端传对象到前端,就相当于打印了这个对象
	前端获取后端传过来的容器类型的内部元素,统一采用句点符(.)
	dic = (a,b,c,d,e,f)
    {{ dic }}  # (a,b,c,d,e,f)
	{{ dic.1}}  # b  # 数字对应的就是数据的索引
    
    前端还能够调用python后端数据类型的一些不需要传参的内置方法
    # 方法后面不需要加括号
    {{ dic.items }}
    {{ dic.keys }}
    {{ dic.values }}

前端注释

会展示到前端的注释:
	<!--原生的html注释-->
不会展示到前端的注释:
	{#模板语法的注释#}

过滤器

后端文件:

def index(request):
    n = 6969
    s = '您好 我是 23 号技 师 很高兴 为您 服务,希望您 能满意!(不带换的'
    # l = ['a','b','c','d','e','f','g']
    l = []
    d = {'name':'jason','password':'222','hobby':['看书','写字','琴棋书画']}
    t = ('关某某','谢某某','陈某某','容嬷嬷')
    st = {'python','java','php','golang'}
    flag = 123
    def func():
        return '你调用了我?'

    class Demo(object):
        def __init__(self,name):
            self.name = name

        def func(self):
            return self.name

        @classmethod
        def index(cls):
            return 'cls'

        @staticmethod
        def bar(name,age):
            return 'bar'

        def __str__(self):
            return '大帅比'

    obj = Demo('jason')
    print(obj)
    # 第一种
    # return render(request,'index.html',{'n':n})
    # 第二种
    file_size = 213213453
    from datetime import datetime
    ctime = datetime.now()
    res = 'hello big ba by~ ~ba by ~baby~ baby~bab y~b aby~b aby~ba by~bab y~ba by~'

    ht = '<h1>我是h1标签</h1>'
    sr = '<script>alert(123)</script>'
    from django.utils.safestring import mark_safe
    xxx = mark_safe('<h1>我是h1标签</h1>')
    return render(request,'index.html',locals())

前端文件过滤器演示:

前端统计字符串的长度>>>:{{ s|length }}

前端获取数据,如果是空的就返回default后面指定的默认参数值>>>:{{ flag|default:'值为空'}}

将数字格式化成标识文件大小的单位>>>:{{ file_size|filesizeformat }}

格式化时间(不要加%)>>>:{{ ctime|data:'Y-m-d' }}

字符串的切片操作>>>:{{ res|slice:0:8:2}}  {#第三个数为步长#}

截取固定的长度的字符串 三个点也算计算长度>>>:{{ s|truncatechars:10 }}

按照空格截取文本内容>>>:{{ res|truncatewords:4}}

数字相加,如都不是int类型则按字符串拼接>>>:{{ 4|add:6 }}
									 {{ 'abc'|add:'efg' }}

重点:
将后端符合标签格式的数据 按照标签形式展现到前端页面上
{{ ht }}
{{ sr }}
这样子只会在前端显示字符串,需要给这些数据取消转义,这样前端就可识别标签内容从而显示到前端页面了
前后端取消转义的方法(*********):
	前端
		{{ ht|safe }}
		{{ sr|safe }}
	后端
		from django.utils.safestring import mark_safe
		xxx = mark_safe('<h1>我是h1标签</h1>')

标签

<!--for循环:-->
{% for foo in l %}
	<p>{{ foo }}</p>
	<p>{{ forloop }}</p>
{% endfor %}

<!--if判断:-->
{% if flag %}
	<P>flag不为空</P>
{% else %}
	<p>flag为空</p>
{% endif %}

<!--嵌套使用-->
{% for foo in l %}
	{% if forloop.first %}
		<p>第一次循环</p>
	{% elif forloop.last %}
		<p>最后一次循环</p>
	{% else %}
		<p>中间的循环</p>
{% endfor %}

<!--empty-->
当你的for循环对象为空的时候回自动走empty代码块的代码
后端:
	l = None
前端:
	{% for foo in l %}
		{% if forloop.first %}
			<p>第一次循环</p>
		{% elif forloop.last %}
			<p>最后一次循环</p>
		{% else %}
			<p>中间的循环</p>
		{% empty %}
			<p>循环的容器类型是空,没法for循环</p>
	{% endfor %}

自定义过滤器|标签|inclusion_tag

必须做的三件事
1、在应用文件夹下新建一个templatetags文件夹(必须叫这个名字)
2、在该新建的文件夹内新建一个任意名称的py文件
3、在该py文件中需要固定写下面两句代码
	from django import template
	
	register = template.Library()

自定义过滤器

# 在上面第二步新建的py文件中写上自定义过滤器的内容
# 自定义过滤器
# 方法一:
	# 后端
	@register.filter  # 注册一个过滤器
    def index(a,b):
        return a+b
	# 前端
    {% load my_tag %}  # 必须先在需要使用的html页面加载写着自定义过滤器的py文件
    {{ 666|index:22}  # 正常的使用一个过滤器的方法使用自定义的过滤器


# 方法二:
     # 后端
	@register.filter(name="xbb")  # 注册一个过滤器,过滤器名用name来定义,定义了之后就没法使用下面函数名来调用过滤器了
    def index(a,b):
        return a+b
    
前端使用过滤器:
    {% load my_tag %}  # 必须先在需要使用的html页面加载写着自定义过滤器的py文件
    {{ 666|xbb:22}}  # 正常的使用一个过滤器的方法使用自定义的过滤器

自定义标签

# 自定义标签也是由通用的两种方式,定义了名字就无法使用函数名调用自定义标签了

# 在上面第二步新建的py文件中写上自定义标签的内容
# 自定义标签
# 后端
@register.simple_tag(name="dbb")
def plus(a,b,c):
    return a+b+c
# 前端
{% load my_tag %}
{% dbb 1 2 3 %}  # 标签传参数是以空格分隔的

自定义inclusion_tag

@register.inclusion_tag("login_html",name="login")
def login(n):
    l = ["第%s项"%i for i in range(n)]
    return {"l":l}  # 将l 传入login_html文件中去

# login.html:不写其他内容,只写:
<ul>
	{% for foo in l %}
    	<li>{{ foo }}</li>
    {% endfor %}
</ul>

# 调用
{% login 5 %}

# 意思就是把内容放到name="login"的"login.html"中渲染,然后在要调用渲染结果的页面使用login调用该渲染结果

注意:

!!!!使用自定义过滤器、标签、inclusion_tag的html页面一定要能够被跳转访问才行,如:return render(request,"test.html")


要想使用自定义的过滤器、标签、inclusion_tag,必须先在需要使用的html页面加载你的py文件
{% load my_tag %}

{{ 666|xbb:22 }}
{% plus 1 2 3 %}
{% login 5 %}

自定义过滤器与标签的区别

自定义过滤器
	是用 {{  }}调用
	最多只能传两个参数
	不可以没有参数
自定义标签
	是用{%  %}调用
	不限制参数个数
	可以没有参数,直接在html中调用,相当于调用一个无参函数

模板的继承与导入

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

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

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

{% block content %}
	页面主体内容
{% endblock %}

继承模板

先继承模板所有的内容
{% extends "home.html" %}

然后根据block块的名字修改指定区域的内容
{% block content %}
	<h1>登录页面</h1>
		<form action="">
		    <p>username:<input type="text" class="form-control"></p>
			<p>password:<input type="text" class="form-control"></p>
			<input type="submit" class="btn btn-success">
        </form>
{% endblock %}

# 即 将名叫content的区域的内容修改为要修改的内容

模板的导入

将一段html当做模块的方式导入到另一个html中展示
{% include "想导入的html文件名" %}

静态文件配置

{% load static %}

# 参考路由反向解析原理
<link rel='stylesheet' href="{% static 'css/mycss.css'%}">  # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">  # 第二种方式
posted @ 2019-06-11 16:37  输诚  阅读(105)  评论(0编辑  收藏  举报