• 07 django模板层


    模板层

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

      模板变量 {{var_name}}

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

      模板标签 {% tag %}

      自定义过滤器和标签

      模板继承

    05 django模板层django_template emplatesindex.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 emplatesadvertise.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 emplatesase.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_templatedjango_templateurls.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_templateapp04urls.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_templateapp04views.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_templateapp04 emplatetags ag_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
  • 相关阅读:
    夯实JavaScript基础之prototype, __proto__, instanceof
    入住博客园
    基础知识盲点——2
    Vuecli开发笔记三引入外部插件
    转让阿里云服务器(CPU2G+内存2G+带宽5M+硬盘150G)
    ubuntu 1
    ftp命令
    mysql数据库备份及恢复命令mysqldump,source的用法
    wordpress option的操作
    wordpress作者角色添加不了视频代码
  • 原文地址:https://www.cnblogs.com/znyyy/p/11299644.html
Copyright © 2020-2023  润新知