django 之模板层

1. 模板语法之变量

  • 格式:{{ 变量名 }}
    句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法)
  • 代码
视图函数:
from django.shortcuts import render
from django.utils.safestring import mark_safe
class Person:
    def __init__(self,name):
        self.name=name
    @classmethod
    def class_test(cls):
        print('class method')
        return 'class method'
    def test(self):
        print('method')
        return self.name
    # def __str__(self):
    #     return self.name
def index(request):
    ss='lqz is big'
    i=20
    ll=['lqz',18,[1,2,[2,3]]]
    ll4=[[1,2,3],[2,3,4],[1,2,9]]
    dic={'name':'lqz','age':18,'t':[1,2,[2,3]]}
    b=True
    lqz=Person('lqz')
    egon=Person('egon')
    xiaohou=Person('xiaohou')
    monkey=Person('monkey')
    ll2=[lqz,egon,xiaohou,monkey]
    dic2={'lqz':lqz,'egon':egon}
    # print(lqz.class_test())
    # print(dic['name'].upper)
    ll3=[]
    ss2=''
    ss3='<a href="https://www.baidu.com">点我</a>'  #链接
    ss3=mark_safe(ss3) #不用转义网页正常显示
    import datetime
    now=datetime.datetime.now()
    file=1024*1024*1024
    return render(request,'index.html',locals()) #locals渲染所有的内容
    # return render(request,'index.html',{'ss':ss,}) #指定单个内容渲染
模板:
<body>
<hr>
<p>字符串:{{ ss }}</p>
<p>数字:{{ i }}</p>
<p>列表:{{ ll }}</p>
句点符,做深度查询
<p>列表第2个值:{{ ll.2.2.0}}</p>
<p>布尔类型:{{ b}}</p>
<p>字典:{{ dic }}</p>
<p>字典取值:{{ dic.age }}</p>
<p>字典取值:{{ dic.t.2.1 }}</p>

<p>对象:{{ lqz }}</p>
<p>对象取值:{{ lqz.name }}</p>

执行方法,不要加括号,
<p>对象方法:{{ lqz.test }}</p>
<p>类方法:{{ lqz.class_test }}</p>
注释:前端看不到,django给处理了
{#<p>类方法:{{ Person}}</p>#}
<p>列表对象{{ ll2 }}</p>
<p>列表对象取值{{ ll2.1 }}</p>
<p>列表对象取值,在取值{{ ll2.1.name }}</p>
<p>对象字典{{ dic2 }}</p>
<p>对象字典取值{{ dic2.egon.name }}</p>
<p>空列表的情况{{ ll3 }}</p>
直接替换成空
<p>空字符串的情况{{ ss2 }}</p>

<p>a标签 {{ ss3 }}</p>
<h4>字典:{{ ss.upper }}</h4>
<h4>字典:{{ dic.name.upper }}</h4>

2.模板语法之过滤器

模板:
(1) date
注:冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
<p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
<p>date过滤器 {{ now|date }}</p>

(2)default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器  {{ ss2|default:'字符串没有值' }}</p>
<p>default过滤器  {{ ll3|default:'列表没有值' }}</p>

(3)length 返回值的长度。它对字符串和列表都起作用
<p>length过滤器  {{ ll2|length }}</p>

(4) filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
<p>filesizeformat过滤器  {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器  {{ 1024|filesizeformat }}</p>

(5)slice 切片操作(同py数据类型切片)
<p>slice过滤器  {{ 'lqzisbig'|slice:'1:9' }}</p>

(6)truncatechars 截断字符
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
<p>truncatechars过滤器  {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>
<p>truncatewords过滤器:  {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>

(7)safe   让django 不要转义网页,正常显示
<p>safe过滤器:  {{ ss3|safe }}</p>
{#可以在视图函数里处理 ss3 = mark_safe(ss3)#}

(8)add  俩参数可以传字符串和数字,具体详见源码
<p>add过滤器:  {{ 12|add:"3" }}</p>  结果:15
<p>add过滤器:  {{ 'eee'|add:"3rrr" }}</p> 结果:eee3rrr

3. 模板语法之标签

3.1 for 标签

<h1>模板语法之标签</h1>
{#   ll = ['lqz', 18, [1, 2, [2, 3]]]#}
{% for foo in ll %}
    <p>{{ forloop }}</p>
{#    循环序号可以通过{{forloop}}显示 #}
{#    {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}#}
    <p>{{ forloop.counter }}</p> #当前循环索引从1开始计数 123
    <p>{{ forloop.counter0 }}</p> #从0开始 012
    <p>{{ forloop.revcounter }}</p>  321
    <p>{{ forloop.revcounter0 }}</p> 210
    <p>{{ forloop.first }}</p>  #判断每次循环出的数是否是第一或者最后一次
    <p>{{ forloop.last }}</p>
{#    遍历每一个元素#}
    <p>{{ foo }}</p>
    
{#    判断实例:#}
    {% if forloop.first %}
        lqz is big
        {% elif forloop.last %}
        两人都小
        {% else %}
        egon is small
    {% endif %}
{% endfor %}   #必须要有结尾

#parentloop用法
{#   ll4 = [[1, 2, 3], [2, 3, 4], [1, 2, 9]]#}
{% for foo in ll4 %}
    {% for i in foo %}
       <p>{{ forloop }}</p>
{#        在内层循环中拿到外层循环的forloop#}
       <p>{{ forloop.parentloop }}</p>
   {% endfor %}
{% endfor  %}

# 循环出字典的值
            {% for i in dic.values %}
                <p>{{ i }}</p>

            {% endfor %}
            <hr>
            {% for i in dic.keys %}
                <p>{{ i }}</p>

            {% endfor %}
            <hr>
            {% for key,value in dic.items %}
                <p>{{ key }}---->{{ value }}</p>

            {% endfor %}

3.2 for... empty

  • 作用:for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作
<!--视图中ll3=[]-->
{% for foo in ll3 %}
    <p>{{ foo }}</p>
    {% empty %}  #要放在在for循环中,如果循环的对象为空,往下执行结果为'没有值'
    没有值
{% endfor %}

3.3 with

  • 作用:使用一个简单的名字缓存一个复杂的变量
{% with tt=dic.name %}
或者{% with dic.name as tt %}
    给取出的内容重新赋值给tt
    <p>{{ dic.name }}</p>
    <p>{{ tt }}</p>
{% endwith %}

3.4 if

  • 作用:{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}
注:if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

4. 自定义过滤器和标签

4.1 自定义过滤器

  • 步骤
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 addstr(用register.filter()装饰)
7 模板内容:
	 {% load my_test %}
	 {{'lqz'|addstr:'isbig' }}  #最多只能传两个参数
  • 代码:
my_test文件:
from django import template
register=template.Library()
@register.filter(name=tt)
def addrstr(x,y):
    return x+y

模板:
<h1>自定义过滤器</h1>
{% load my_test %}
{#   过滤器可以是函数名,也可以是name指定的值 @register.filter(name=tt)#}
   {{ 'lqz'|addrstr:'isbig' }}  #lqzisbig 最多只能传两个参数

4.2 自定义标签

  • 步骤:
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 
	@register.simple_tag(name='yy')
	def my_sum(x,y,z,i):
        return x+y+z+i
7 模板:
	{% load my_test %}
	{% yy 12 34 56 78 %}  #以空格做分割,传参数

代码:

my_test文件:
from django import template
@register.simple_tag(name='hh')
def sun(x,y,z):
    return x+y+z

模板:
{% load my_test %}
{% hh 5 4 7 %}   #以空格作分割,传参数
  • 自定义的过滤器,可以放在if判断里,
    自定义的标签,不能放在if判断里条件里

4.2 静态文件导入

方式一:
<link rel="stylesheet" href="/static123/mycss.css">
方式二:
{% load static %}
<link rel="stylesheet" href="{% static 'mycss.css'%}">
方式三:
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">

5. 模板导入与继承

5.1 模板导入

1 把公共部分,放到html里,比如叫 left.html
2 想在哪里用 导入{% include 'left.html' %}

5.2 模板继承

1  写一个母模板 base.html
2 要更改的地方在block标签编辑
		{% block base %}
			母模板的盒子里也可以写东西
		{% endblock %}
3 在其他文件中调用母模板{%extends 'base.html' %}
4 建盒子编辑自己的内容;
        {% block base %}
        自己的东西
        {% endblock my_head%}
5 用母版里的内容({{block.super}} 放在那,原来母版里的东西,就会渲染在哪)
		{% block base %}
		{{block.super}}
		自己的东西						
		{% endblock my_head%}
注:(1)如过不继承母模板盒子,它会用原来的内容;如果继承了,没写自己的东西,它会空白;写自己的内容就是什么内容,
通过{{block.super}},可渲染出原来母模板的内容
(2)盒子再继承时,跟顺序无关

6. inclusion_tag

  • 作用:返回html代码片段
  • 步骤
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 @register.inclusion_tag('test.html')
	def my_inclusion(n):
		data=[]
		for i in range(n):
			data.append('第%s行'%i)
		return {'data':data}
7 写test.html页面
		<ul>
		  {% for choice in data %}
			<li>{{ choice }}</li>
		  {% endfor %}
        </ul>
	
8 视图函数中要渲染的页面
{% load my_test %}
 {% my_inclusion 10 %}   #它会返回html的页面
posted @ 2019-07-21 08:05  朝朝哥  阅读(210)  评论(0编辑  收藏  举报