07 django模板层

模板层

主要掌握以下几个知识点:

  模板变量 {{var_name}}

  过滤器 {{obj|filter__name:param}}

  模板标签 {% tag %}

  自定义过滤器和标签

  模板继承

 

05 django模板层\django_template\templates\index.html

  1 <!--!!!模板继承 重要!!!-->
  2 <!--extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。-->
  3 {% extends 'base.html' %}
  4 
  5 <!--继承后,模版引擎注意到 base.html 中的两个 block 标签,并用子模版中的内容来替换这些block。-->
  6 <!--为了更好的可读性,你也可以给你的  endblock  标签一个名字 。例如加的 title:-->
  7 {% block title %}
  8 <title>index</title>
  9 {% endblock title%}
 10 
 11 
 12 {% block content %}
 13     <!--如果需要把继承模板的该部分内容带过来,写下这句话,不写则直接覆盖-->
 14     {{ block.super }}
 15 
 16     <h1>模板&标签</h1>
 17     <hr>
 18     <h2>模板变量</h2>
 19     <p><strong>int</strong>  {{ digits }}</p>
 20     <p><strong>str</strong>  {{ string }}</p>
 21     <p><strong>lis</strong>  {{ lis }}</p>
 22     <p><strong>lis_items</strong>  {{ lis.0 }}  {{ lis.1 }}</p>
 23     <p><strong>dic</strong>  {{ dic }}</p>
 24     <p><strong>dic_items</strong>  {{ dic.name }}  {{ dic.age }}</p>
 25     <p><strong>jack</strong>  {{ jack }}</p>
 26     <p><strong>jack_items</strong>  {{ jack.name }}</p>
 27     <p><strong>person_lis</strong>  {{ person_lis }}</p>
 28     <p><strong>person_lis_items</strong>  {{ person_lis.1.name }} {{ person_lis.1.age }}</p>
 29 
 30     <hr>
 31     <h2>过滤器</h2>
 32     <!--default  如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值-->
 33     <p><strong>default</strong>  {{ lis2|default:'nothing' }}</p>
 34     <!--length 返回值的长度。它对字符串和列表都起作用-->
 35     <p><strong>length</strong>  {{ lis|length }}</p>
 36     <!--filesizeformat  将值格式化为一个 “人类可读的” 文件尺寸 (例如 '1 KB', '11.5 MB', '189 bytes')-->
 37     <p><strong>filesizeformat</strong>  {{ filesize|filesizeformat }}</p>
 38     <!--date 可以按指定的日期格式  'Y-m-d H:m:s'-->
 39     <p><strong>date</strong>  {{ now|date:'H:m:s' }}</p>
 40     <!--slice 切片  同list切片-->
 41     <p><strong>slice</strong>  {{ lis|slice:'2:' }}</p>
 42     <!--truncatechars 截取字节长度,比如参数6,截取5个字节,剩下的用省略号表示-->
 43     <p><strong>truncatechars</strong>  {{ string|truncatechars:3 }}</p>
 44     <!--truncatewords 截取单词,比如参数1,截取1个单词,剩下的用省略号表示-->
 45     <p><strong>truncatewords</strong>  {{ string|truncatewords:1 }}</p>
 46     <!--safe 信任返回的数据,对特定的html或者js等的语句不转义-->
 47     <p><strong>没有safe</strong>  {{ ops }}</p>
 48     <!--<p><strong>有safe</strong>  {{ ops|safe }}</p>-->
 49 
 50     <hr>
 51     <h2>模板标签</h2>
 52     <h3>for 标签</h3>
 53     {% for i in person_lis %}
 54     <!--{{forloop.counter}}  计数  从1开始    {{forloop.counter0}} 从0开始-->
 55     <p>{{forloop.counter}}  {{ i.name }}</p>
 56     <p>{{forloop.counter}}  {{ i.age }}</p>
 57     <!--empty 标签  在for循环无数据的时候执行其逻辑-->
 58     {% empty %}
 59     <p>暂无数据!</p>
 60     <!--结束标签-->
 61     {% endfor %}
 62     <h3>if 标签</h3>
 63     {% if n > 18 %}
 64     <p><strong>成年咯</strong></p>
 65     {%  elif n == 18 %}
 66     <p><strong>刚成年</strong></p>
 67     {% else %}
 68     <p><strong>小屁孩</strong></p>
 69     {% endif %}
 70     <h3>with 标签</h3>
 71     <!--等于命名一个变量,后面引用就好-->
 72     {% with person_lis.1.name as name %}
 73     <p>{{ name }}</p>
 74     <p>{{ name }}</p>
 75     <p>{{ name }}</p>
 76     {% endwith %}
 77     <h3>csrf_token 标签</h3>
 78     <form action="" method="post">
 79         <!--django有安全机制,post请求会校验,如果没有下面的csrf_token标签,在请求后台的时候回403 Forbidden -->
 80         <!--这个标签等于是在请求的index页面的时候,后台回有一个 csrf_token 字段,下次post请求的时候会和post参数一起传过去,后台校验token一致才会接受该post请求-->
 81         {% csrf_token %}
 82         <input type="text" name="user">
 83         <input type="password" name="pwd">
 84         <input type="submit">
 85     </form>
 86 
 87     <hr>
 88     <h2>自定义过滤器和标签</h2>
 89     步骤:
 90     <p>1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.</p>
 91     <p>2、在app中创建templatetags模块(模块名只能是templatetags)</p>
 92     <p>3、创建任意 .py 文件,如:my_tags.py</p>
 93     <p>4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py</p>
 94     {% load tag_filters %}
 95     <!--   multi_filter 自定义过滤器  最多只能两个参数    -->
 96     <p>{{ n|multi_filter:10 }} </p>
 97     <!--   multi_tag 自定义标签 参数数量没有限制   -->
 98     <p>{% multi_tag 10 100 %} </p>
 99     <!--注意:filter可以用在if等语句后,simple_tag不可以-->
100     {% if n|multi_filter:10 > 100 %}
101         {{ n|multi_filter:10 }}
102     {% endif %}
103 
104     <hr>
105     <h2>模板继承</h2>
106     <p>如果你在模版中使用模板继承extends标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。</p>
107     <p>在base模版中设置越多的 block 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。</p>
108     <p>如果你发现你自己在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 block 中。</p>
109     <p>如果不想覆盖继承模板的盒子内容,想在其内容上增加内容,用 block.super </p>
110 {% endblock content%}

 

05 django模板层\django_template\templates\advertise.html

 1            <div class="action">
 2                 <div class="panel panel-danger">
 3                     <div class="panel-heading">Panel heading without title</div>
 4                     <div class="panel-body">
 5                         11111
 6                     </div>
 7                 </div>
 8                 <div class="panel panel-warning">
 9                     <div class="panel-heading">Panel heading without title</div>
10                     <div class="panel-body">
11                         22222
12                     </div>
13                 </div>
14                 <div class="panel panel-success">
15                     <div class="panel-heading">Panel heading without title</div>
16                     <div class="panel-body">
17                         3333
18                     </div>
19                 </div>
20             </div>

 

05 django模板层\django_template\templates\base.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     {% block title %}
 6         <title>base——title</title>
 7     {% endblock title %}
 8     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
 9           integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
10     <style type="text/css">
11         *{
12             padding: 0;
13             margin:0;
14         }
15         .header{
16             width:100%;
17             height: 50px;
18             background-color: #369;
19         }
20     </style>
21 </head>
22 <body>
23 
24 <div class="header"></div>
25 
26 <div class="container">
27     <div class="row">
28         <div class="col-md-3">
29             {% include 'advertise.html' %}
30         </div>
31         <div class="col-md-9">
32             {% block content%}
33             <h3>base_content</h3>
34             {% endblock %}
35         </div>
36     </div>
37 </div>
38 
39 </body>
40 </html>

 

05 django模板层\django_template\django_template\urls.py

from django.contrib import admin
from django.urls import path, re_path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^app01/', include(('app04.urls','app04'))),
]

 

05 django模板层\django_template\app04\urls.py

from django.urls import path, re_path
from app04 import  views

urlpatterns = [
    re_path(r'^index/', views.index),
    re_path(r'^base/', views.base),
]

 

05 django模板层\django_template\app04\views.py

from django.shortcuts import render,HttpResponse
import  datetime


def index(request):
    # 模板变量
    if request.method != 'POST':
        n = 18
        digits = 123
        string = 'hello world!'
        lis = [1,2,3,'a']
        dic = {'name': 'xg','age':18, 'height':180}
        lis2 = []
        filesize = 12345678
        now = datetime.datetime.now()
        ops = "<script type='text/javascript'>alert('js脚本强制弹窗')</script>"
        class Person:
            def __init__(self,name,age):
                self.name = name
                self.age = age
        jack = Person('jack',22)
        rose = Person('rose',25)
        person_lis = [jack,rose]
        # person_lis = []
        # return render(request, 'index.html',{'digits':digits,'string':string,'lis':lis,'dic':dic,'jack':jack,'rose':rose,'person_lis':person_lis})
        # 如果变量太多,字典就很长了,所以这里可以写成locals() 将当前名称空间的变量都传给模板。
        return render(request, 'index.html',locals())
    else:
        print(request.POST)
        return HttpResponse('OJBK!')


def base(request):
    return  render(request, 'base.html')

 

05 django模板层\django_template\app04\templatetags\tag_filters.py

from django import template


register = template.Library()


@register.filter
def multi_filter(x,y):
    return x*y


@register.simple_tag
def multi_tag(x,y):
    return x*y

 

posted @ 2019-08-04 20:47  毛斯钢  阅读(154)  评论(0编辑  收藏  举报