目录
模板层
后端朝前端页面传递数据的方式
# 第一种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 }}
前端注释
会展示到前端的注释: 不会展示到前端的注释: {#模板语法的注释#}
过滤器
后端文件:
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标签
' sr = '' from django.utils.safestring import mark_safe xxx = mark_safe('我是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标签
')
标签
{% for foo in l %}{
{ foo }}{
{ forloop }}{% endfor %} {% if flag %}flag不为空
{% else %}flag为空
{% endif %} {% for foo in l %} {% if forloop.first %}第一次循环
{% elif forloop.last %}最后一次循环
{% else %}中间的循环
{% endfor %} 当你的for循环对象为空的时候回自动走empty代码块的代码后端: l = None前端: {% for foo in l %} {% if forloop.first %}第一次循环
{% elif forloop.last %}最后一次循环
{% else %}中间的循环
{% empty %}循环的容器类型是空,没法for循环
{% 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:不写其他内容,只写:
- {% for foo in l %}
- { { foo }} {% endfor %}
注意:
!!!!使用自定义过滤器、标签、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 %}{% endblock %}# 即 将名叫content的区域的内容修改为要修改的内容登录页面
模板的导入
将一段html当做模块的方式导入到另一个html中展示{% include "想导入的html文件名" %}
静态文件配置
{% load static %}# 参考路由反向解析原理 # 第一种方式 # 第二种方式