Django之模板层

模版层

两种给模版传参的方式(字典,locals())

# 第一种
	return render(request,'index.html',{'n':n})
	# 第二种
	return render(request,'index.html',locals())  
	# 将当前所在的名称空间中的名字全部传递给前端页面
	
	后端传函数名到前端,会自动加括号调用,但是不支持传参

前端如何接收( {{}} )

先传python基本数据类型(数字,字符串,列表,元祖,字典) 前端加{##}模版语言注释,前端是看不到的

在传函数名(前端自动加括号执行,要不想被执行只想看函数名打印结果可以放到列表中传到前端)

传类的对象去前端不要传类

变量前端都能接收到,现在需要介绍如何查找变量里面的值(深度查询)

# 获取容器对象内数据 统一使用句点符 .
('关某某','谢某某','陈某某','容嬷嬷')>>>:{{ t }},{{ t.1 }}  #数字对应的就是数据的索引
{{dic.name}}  # 获取字典值
{{div.hobby.0}}  # 如果一次查询还是容器类型则继续可以点方式取值

{{obj.name}}  # jason
{{obj.get_name}}  # jason
{{obj.get_cls}}  # cls
{{obj.get_static}}  # static
# 如果对象调用的方法需要传参数  模版不支持!!!

# python中字符串,列表等自带的一些方法,到前端依然可以不加括号直接调用,但是不能调带参数的!!!

模版语法之过滤器

# 先用|length统计字符串或列表的长度,再点进去查看源码,加注释总结,|前面的值会当作第一个参数传递给|后面的函数
{{ l1|length }}

# 再来一个可以再传一个参数的过滤器,源码看一下
{{ l2|default:'是空的' }
 
# 几个常用的过滤器
filesizeformat  # 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)

date  # 如果 value=datetime.datetime.now() {{ value|date:"Y-m-d" }} 前端可以展示原生的时间可以经过过滤器处理过后的时间对比查看

slice  # 如果 value="hello world"  {{ value|slice:"0:5:2" }} 支持步长

truncatechars  # 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。  {{ value|truncatechars:9 }}  三个点也算三个数
 
truncatewords  # 截断字符 三个点不算数

add  # 给数字加一个值,如果第一个参数是字符串,会默认全转成字符串进行拼接

safe  # 取消转义 	{{ value|safe }}
# 用script脚本阐明转义的意义

模版语法之标签

# for循环
{% for foo in l1 %}
<p>{{ forloop }}</p>
{% endfor %}
# {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 5, 'revcounter0': 4, 'first': True, 'last': False}

# if判断
{% if user %}
	hello
{%else%}
	world!
{% endif %}

# if嵌套在for循环里面
{% for foo in l1%}
	{% if forloop.first %}
  	第一次的我
  {% elif forloop.last %}
  	最后一次的我
  {% else %}
  	{{ foo }}
  {% endif %}
{% endfor %}

# empty
# 当被循环对象是空的时候才会走empty下面的

# for循环字典
{% for k in dic.keys%}
{% for k in dic.values%}
{% for k in dic.items%}

# with起别名(当获取的变量在多层嵌套关系中的时候)
{% with div.l1.2 as ttt%}
{{ ttt }}
{% endwith %}
# 只要在这个with包裹的区域内都可以使用ttt

自定义标签({%%}中使用)和过滤器(变量相关{{}}中使用)及inclusion_tag返回html片段

# 自定义过滤器与标签及inclusion_tag步骤:
# 1.在app中创建templatetags模块(模块名只能是templatetags)
# 2.创建任意 .py 文件,如:my_tags.py
# 3.文件中必须先写下面两句
from django import template
register = template.Library()   

# 自定义过滤器
@register.filter(name='baby')
def my_sum(v1,v2):
  return v1+v2
# 模版中使用
{% load my_tags%}
{{  price|baby:'88' }}

# 自定义标签
@register.simple_tag(name='plus')
def puls(a,b,c)
	return '%s+%s+%s'%(a,b,c)
# 模版中使用
{% load my_tags%}
{% plus 'jason' 66 666%}

# 注意点:自定义的过滤器可以用在if判断,自定义的标签不可以
{% if 6|baby:4 %}
<p>肯定是有值的</p>
{% endif %}
# 错误示范
{% if plus 'jason' 6  6 %}
<p>肯定是有值的</p>
{% endif %}

# 自定义inclusion_tag返回前端片段
from django import template
register = template.Library()

@register.inclusion_tag('result.html')
def show_results(n):
    n = 1 if n < 1 else int(n)
    data = ["第{}项".format(i) for i in range(1, n+1)]
    return {"data": data}
  
# result.html
<ul>
  {% for choice in data %}
    <li>{{ choice }}</li>
  {% endfor %}
</ul>

# 模版中使用
{% load inclusion_tag_test %}
{% show_results 10 %}

模版的继承与导入

# 模版的继承
{% extend 'base.html' %}
# 既想用自己的也想用母版的
{% block content %}
{{ block.super }}  # 固定语法可以直接调用到模版的内容
{% endblock %}

# 模版的导入
{% include 'left.html '%}

静态文件配置

# 第一种 直接写死

# 第二种
{% load static %}  # 先加载

<link rel='stylesheet' href="{% static 'css/mycss.css'%}">  # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">  # 第二种方式
原文地址:https://www.cnblogs.com/fuwei8086/p/11006139.html