模板层

模板层

模版语法重点:
  变量:{{ 变量名 }}
    1 深度查询 用句点符
    2 过滤器
  标签:{{% % }}

views.py

from django.shortcuts import render
from django.http import JsonResponse
​
# Create your views here.
def index(request):
    name = 'lqz'
    age = 18
    ll = [1, 2, 'lqz', 'egon']
    ll2=[]
    dic2={}
    tu = (1, 2, 3)
    dic = {'name': 'lqz', 'age': 18, 'll': [1, 2, 4]}
​
    # 函数
    def test():
        print('lqz')
        return 'zhouxiang dsb'# 在模板上相当于执行该函数,并打印
    print(test())
​
    # 类和对象
    class Person():
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def get_name(self):
            return self.name
        @classmethod
        def cls_test(cls):
            return 'cls'
        @staticmethod
        def static_test():
            return 'static'
        # 模板里不支持带参数
        def get_name_cs(self,ttt):
            return self.name
        
    lqz=Person('lqz',18)
    egon=Person('egon',18)
    person_list=[lqz,egon]
    person_dic={'lqz':lqz}
​
    file_size=1024
    import datetime
    ctim=datetime.datetime.now()
​
    h1='<h1>你好</h1>'
    script='<script>alert(111)</script>'# user='lqz'
    user=''# return render(request,'index.html',{'name':name})
    # locals() 会把*该*视图函数内的变量,传到模板
    return render(request, 'index.html', locals())

1.模板语法变量

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#模板语言注释:前端看不到#}
{#相当于print了该变量#}
<h1>模板语言之变量</h1>
<p>字符串:{{ name }}</p>
<p>数字:{{ age }}</p>
<p>列表:{{ ll }}</p>
<p>元祖:{{ tu }}</p>
<p>字典:{{ dic }}</p>
{#只写函数名:相当于函数名(),执行该函数#}
<p>函数:{{ test }}</p>
{#对象内存地址#}
<p>对象:{{ lqz }}</p>
<p>列表套对象:{{ person_list }}</p>
<p>字典套对象:{{ person_dic }}</p>
<hr>
<h1>深度查询</h1>
<p>列表第0个值:{{ ll.0 }}</p>
<p>列表第3个值:{{ ll.3 }}</p>
<p>字典取值:{{ dic.name }}</p>
<p>字典取列表值:{{ dic.ll }}</p>
{#再继续取值,继续点#}
<p>对象取数据属性:{{ lqz.name }}</p>
<p>对象取绑定给对象的函数属性:{{ lqz.get_name }}</p>
<p>对象取绑定给类的函数属性:{{ lqz.cls_test }}</p>
<p>对象取静态方法:{{ lqz.static_test }}</p>
<p>把对象列表中egon年龄取出来:{{ person_list.1.age }}</p>
{#拓展:不能调有参数的方法#}
<p>字符串的方法:{{ name.upper }}</p>
​
​
</body>
</html>

 

2.模板语法过滤器

-语法:{{第一个参数|过滤器名字:第二个参数}}
-常用过滤器:(详细用法见源码)
   -length
   -default
   -slice
   -date
   -filesizeformat
   -truncatechars
   -truncatewords
   -safe
   -add

HTML

<h1>模板语言之过滤器</h1>
{#后面就是个python中的函数,|前面的,是函数的第一个参数,冒号后面的是第二个参数#}
<p>统计字符串长度:{{ name|length }}</p>
<p>统计列表长度:{{ ll|length }}</p>
<p>过滤器之默认值:{{ ll2|default:'没有值' }}</p>
<p>过滤器之filesizeformat--1:{{ 201334444444444444443|filesizeformat }}</p>
<p>过滤器之filesizeformat--2:{{ file_size|filesizeformat }}</p>
<p>过滤器之不使用date:{{ ctim }}</p>
<p>过滤器之date:{{ ctim|date:'Y-m-d' }}</p>
{#前闭后开区间#}
<p>过滤器之slice:{{ ll|slice:'2:-1' }}</p>
{#支持步长#}
<p>过滤器之slice-字符串:{{ name|slice:'0:3:3' }}</p>
{#三个起步#}
<p>过滤器之truncatechars:{{ 'dafddfafgadfgaasdgadgfadaf'|truncatechars:5 }}</p>
<p>过滤器之truncatewords:{{ '我 dfaf ga dfgaas 你 dgf adaf'|truncatewords:5 }}</p>
<p>过滤器之不用safe:{{ h1 }}</p>
<p>过滤器之用safe:{{ h1|safe }}</p><p>过滤器之不用safe:{{ script }}</p>
{#<p>过滤器之用safe:{{ script|safe }}</p>#}
<p>过滤器之用add:{{ 12|add:'1' }}</p>
<p>过滤器之用add:{{ 'egon'|add:'dsb' }}</p>

 

3.模板语法标签

-{% 标签 %}
-for:forloop:对象(里面有好多东西:parentloop,last,first,counter....)忘记的话,    自己打印一下
   empty:被循环的对象是空,才走它
   for循环可以嵌套,也可以用if
-if:
   {% if forloop.first %}
      <p>第一次的我 </p>
   {% elif forloop.last %}
      <p>最后的我 </p>
   {% else %}
      <p>{{ foo }}</p>吧
   {% endif %}
-with:重命名,应用在变量名过长
********都要有结束********

HTML

<h1>模板语言之标签</h1>
{% for foo in ll %}
    {{ forloop }}
<p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
{% endfor %}
​
{% for foo in ll %}
    {% for i in person_list %}
  取出外层是第几次循环
        {{ forloop.parentloop.counter }}
        <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
    {% endfor %}
{% endfor %}
​
{#**************循环的对象是空,才会走到empty,而不是对象里面的东西为空#}
{% for foo in dic2 %}
    <p>{{ foo }}</p>
    {% empty %}
    傻逼了
{% endfor %}
​
{#只循环字典的话,取到的是key值#}
{% for foo in dic %}
{#取到value的值#}
{% for foo in dic.values %}
{#取到key 和 value的值#}
{% for k,foo in dic.items %}
    <p>{{ k }}----->{{ foo }}</p>
    {% empty %}
    傻逼了
{% endfor %}
​
{% if user %}
    <a href="">退出</a>
    {% else %}
    <a href="">登录</a>
    <a href="">注册</a>
{% endif %}
​
{#for循环判断如果是第一次,打印第一次,其他打印正常值#}
{% for foo in ll %}
    {% if forloop.first %}
        <p>第一次的我 </p>
    {% elif forloop.last %}
        <p>最后的我 </p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
{% endfor %}
​
<hr>
with 相当于取别名,作用:变量太长,可以简化
{% with name as ttt %}
    {{ ttt }}
    {{ name }}
    {{ user }}
​
{% endwith %}
​
{% with dic.ll.2 as ttt %}
    {{ ttt }}
​
    {{ ttt }}
​
{% endwith %}

 

4.自定义过滤器和标签

标签不能用在if判断中,过滤器可以用在if判断中

-自定义过滤器

-1 先确认app是不是已经在setting中注册
   -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
   -3 在模块下创建一个py文件,名字随意:mytag.py
   -4 # 第一步,导入template
      from django.template import Library
      # 第二步,定义一个叫register的变量=template.Library()
      register = Library()
   -5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名)
      def str_add(str1, str2): #一定要有返回值
         # 业务逻辑很复杂
         return str1 + str2
   -6 在模板里:(新定定义的标签,过滤器,都要重启程序)
      -{% load mytag %}
      -{{'lqz'|str_add:'nb'}}      

-自定义标签:

-1 先确认app是不是已经在setting中注册
   -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
   -3 在模块下创建一个py文件,名字随意:mytag.py
   -4 # 第一步,导入template
       from django.template import Library
       # 第二步,定义一个叫register的变量=template.Library()
       register = Library()
   -5 只是装饰器不一样
   @register.simple_tag()
       def add_nb(value):
          return value+'nb'
   -6 在模板里:(多个参数,以空格区分)
       -{% load mytag %}
       -{% add_nb 'lqz'%}

5.模板的导入与继承

模板的导入:

  语法:{% include '模版名称' %}

模板的继承:

1. 写一个母版,留一个可扩展的区域(盒子),可以留多个盒子(留的越多,可扩展性越高) {%block 名字%} 可以写内容 {%endblock%}

2. 在子模板中使用: {%block 名字%} 子模板的内容 {%endblock 名字%}

 

6.静态文件相关配置

1 写死静态文件:<link rel="stylesheet" href="/static/css/mycss.css">
​
2 使用 static标签函数:
   -{%load static%}
   #static返回值,会拼上传参的路径
   -{% static "传参"%}
   <link rel="stylesheet" href="{% static 'css/mycss.css' %}">
​
3 使用get_static_prefix 标签
   -{%load static%}
   #get_static_prefix返回值是:静态文件的地址,相当于/static/
   -{% get_static_prefix %}css/mycss.css
   <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">

 

 

原文地址:https://www.cnblogs.com/zhangpang/p/9974892.html