七 .Django 模板(template)

一 .Django 模板(template)使用

1 . 组成:HTML代码+逻辑控制代码

https://www.cnblogs.com/dangrui0725/p/9612157.html

1、变量  {{  var_name }}

  当模版引擎遇到一个变量,将计算这个变量,然后将结果输出

  变量名必须由字母、数字、下划线(不能以下划线开头)和点组成

  当模版引擎遇到点("."),会按照下列顺序查询:

字典查询,例如:foo["bar"]   {{foo.bar}}
属性或方法查询,例如:foo.bar
数字索引查询,例如:foo[bar]  {{all_students.0}}
如果变量不存在, 模版系统将插入'' (空字符串)

在模板中调用方法时不能传递参数

   <h1>hello---{{name}}</h1>
   <br/>
   <h1>list列表</h1>
   <h1>{{cc}}</h1>
   <h1>{{cc.0}}通过点来取值</h1>
   <h1>{{cc.1}}通过点来取值</h1>  
  
 
   <h1>dict字典</h1>
   <h1>{{f}}</h1>
   <h1>{{f.name}}通过点来取值</h1>
   <h1>{{f.age}}通过点来取值</h1> 
2 .{ % tag % }

作用 在输出中创建文本 控制循环或逻辑 加载外部信息到模板中供以后的变量使用

标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。

一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})

 
3 .for标签
 {%for 变量 in 列表%}
  语句1
{%endfor%}

{
%for 变量 in 列表%} 语句1 {%empty%} 注意:列表为空不存在时执行语句2 语句2 {%endfor%}

<ul>
{% for cc in bb %}
     <li>
          {{cc.sanme}}------{{cc.age}}
     </li>
{%empty%}
    <li> 目前没有学生。。。。。。。。。。。。。。。。 </li>
{%endfor%}
</ul>

 

<h3>循环取值1</h3><hr>
{% for item in person_list %}
    <p>{{ item.name }},{{ item.age }}</p>
{% endfor %}

<h3>循环取值2:倒序</h3><hr> {% for item in person_list reversed %} <!--序号从1开始--> <p>{{ forloop.counter }}----->{{ item.name }},{{ item.age }}</p> <!--序号从0开始--><p>{{ forloop.counter0 }}----->{{ item.name }},{{ item.age }}</p><!-- 序号倒序 --><p>{{ forloop.revcounter }}----->{{ item.name }},{{ item.age }}</p> {% endfor %}
<h3>循环取值3:字典</h3><hr> {% for k,v in d.items %} <p>{{ k }},{{ v}}</p> {% endfor %}
for....empty :for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %

 

4.if标签
 {%if表达式%}
 语句
 {%endif%}
 {%if表达式%}
        语句1
{%else%}
       语句2
{%endif%}
    

  {%if 条件%}

     执行的代码

 {%elif 条件%}

    执行的代码

 {%else%}

    执行的代码

 {%endif%}


{%if num%}
    <h1>哈哈哈哈哈哈哈哈哈哈哈哈哈11111111111111111111 哈哈哈 num </h1>
{%endif%}

 

{% if i > 300 %}
<p>大于{{ i }}</p>
{% elif i == 200 %}
<p>等于{{ i }}</p>
{% else %}
<p>小于{{ i }}</p>
{% endif %}

5. comment注释

{%comment%}
    注释内容
{%endcomment%}

 
6 .ifequal / ifnotequal   

ifequal / ifnotequal   作用 判断是否相等

     格式:  {%ifequal 值1  值2%}
            语句
            {%endifequal%}  注意: 如果值1= 直2 执行语句

     实例:
      {%ifequal  'lover' 'lover'}
          <li> 目前没有学生。。。。。。。。。。。。。。。。 </li>
       {%endifequal%}

                         
7、csrf_token:这个标签用于跨站请求伪造保护

提交数据的时候就会做安全机制,当你点击提交的时候会出现一个forbbiddon
的错误,就是用setting配置里的scrf做安全机制的,那么我们可以吧它给注释了,,,
或者在form表单下面添加一个{% csrf_token %},,,
这才是真正解决的办法,注释不是解决的办法

<h3>scrf_token</h3><form action="/tag/" method="post">
    {% csrf_token %}
    <p><input type="text" name="haiyan"></p>
    <input type="submit">
</form>


8 .with:
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
{
% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %} <p>{{ person_list.2.name }}</p> {% with name=person_list.2.name %} <p>{{ name }}</p> {% endwith %}
9 .url:反向解析

   url(r'^post/', views.postister,name="aa"),

   <form action="{% url 'aa' %}" method="post">  

     url(r'^', include('myapp.urls',namespace="app")),
     url(r'^good/(\d+)$',views.good,name="good"),
<a href="{%url 'app:good' 1 %}">链接111111。。。。。。。。。。。。。。。。。。。。。。。。。。。。。</a>
10 .load staticfiles  静态文件

2.settings.py中配置要在 STATIC_URL = '/static/'  下边 


{% load staticfiles %}

STATICFILES_DIRS
= [     os.path.join(BASE_DIR, 'static'),   ]   或   STATIC_ROOT = os.path.join(BASE_DIR, 'static') 3.前端引入   方法一、        在页面的较上处写:       {% load staticfiles %}       在 link script 等src 写 :       {%static 'xxx.css'%}        {%static 'xxx.js'%}

<!DOCTYPE html>
<html>
<head>
{%load staticfiles%}
<meta charset="UTF-8">
<title>显示数据</title>
<!-- <link rel="stylesheet" type="text/css" href="{%static 'webpage/css/aa.css'%}">-->
<script type="text/javascript" src="{%static 'webpage/js/jquery1.js'%}"></script>
<style>

11 .{{request_path}}

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>404页面</title>
    </head>
    <body>
     <h1>页面信息飞到外星去了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。</h1>

    <h2>{{request_path}}</h2>



    </body>
</html>
5. 过滤器

语法:{ { 变量|过滤器 }}

{ { name|lower }},表示将变量name的值变为小写输出

使用管道符号 (|)来应用过滤器

通过使用过滤器来改变变量的计算结果

   <h1>从字符串中移除指定的字符:-- {{e|cut:" "}}</h1>

   <h1>add:加法 ---{{w|add:10}}</h1>

   <h1>add:加法 ---{{w|add:10}}</h1>

   <h1>格式化时间字符串-- {{r}}</h1>
   <h1>格式化时间字符串-- {{r|date:"Y-m-d"}}</h1>
根据给定格式转换日期为字符串     date   格式  {{dateVal|date:'y-m-d'}} <h1>空列表--- {{ls}}</h1> <h1>空列表--- {{ls|default:"空的列表"}}</h1> <br/> <h1>模板中a链接跳转 要加上过滤 </h1> <h1>a链接跳转--- {{aa}}</h1> <h1>a链接跳转--- {{aa|safe}}</h1> {%autoescape off%} <h1> {{aa}}</h1> {%endautoescape%} <br/>
<h1>字符串处理过滤器</h1> <h1>---{{s|filesizeformat}}</h1> <h1>取值--- {{s|first}}</h1> <h1>获取字符串长度--- {{s|length}}</h1> <h1>字符串截取--- {{s|slice:"5"}}</h1> <h1>{{q}}</h1> <h1>把字符串转换成大写:-- {{q|upper}}</h1>


如果一个变量没有被提供 或者值为false 空 可以默认使用 default
格式:{{var|default:'AHAHAHAHAH'}}

<h2>{{aa|default:"没有了哈哈哈"}}</h2>

 12 include:加载模板并以标签内的参数渲染

格式: {%include 模板目录 参数1 参数2%

 { %include "foo/bar.html" % }

该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。

每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。

{% include 'test.html' %}

 

13 加减乘除:

<h4>num={{num}} </h4>
<!-- 加 -->
<h4>{{num|add:10}} </h4>
<!-- 减 -->
<h4>{{num|add:-5}} </h4>
<!-- num/1*4 -->
<!-- 乘 -->
<h4>{% widthratio num 1 5 %} </h4>
<!-- num/5 -->
<!-- 除 -->
<h4>{% widthratio num 5 1 %} </h4>
14 .{% load %}: 加载标签库 

{% load xxx %} 加载自定义的filter
  {%load my_tags%}
15 .自定义filter和tag
1、在app中创建名称为templatetags的包(必须的)
2、在里面创建任意 .py 文件,如:my_tags.py
3、写my_tags.pyfrom django import template

from django.utils.safestring import mark_safe
from django import template
register = template.Library()   #register的名字是固定的,不可改变
@register.filter  # 自定义的filter   只能有三个参数
def filter_multi(v1,v2):
    return  v1 * v2      

@register.simple_tag  # 自定义的tag
def simple_tag_multi(v1,v2):
    return  v1 * v2

@register.simple_tag  # 自定义的tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)


# 自定义标签
@register.simple.tag
def bb(x,y,c):
    return x*y*c
在模板中调用自己写的filter

{% load my_tags%}
 # num=12

{{ num|filter_multi:2 }} #24

{{ num|filter_multi:"[22,333,4444]" }}


{% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}

# filter可以用在if等语句后,simple_tag不可以


2 . 模板继承

模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。 典型应用:网站的头部、尾部信息
如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同。父模板中也可以使用上下文中传递过来的数据。

父模板
base.html 
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>首页哈哈哈哈哈</title>
        <style type="text/css">
         #header{
           width: 100%;
           height: 100px;
           background:red;
         }
          #footer{
           width: 100%;
           height: 100px;
           background:blue;
         }
        </style>
    </head>
    <body>
    <!-- 头 -->
   <div id="header"></div>  

   <div id="main"> 
         {%block  main%}


         {%endblock main%}

   </div>
   <!-- 尾 -->
   <div id="footer">1111</div> 
    </body>
</html>
子模版1
01data_temp.html
{% extends 'app_html/base.html' %}

{%block main%}
<h1>啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦</h1>
{%endblock main%}
子模版2
02data_tomp.html

{% extends 'app_html/base.html' %} {%block main%} <h1>哈哈哈哈哈哈哈哈哈哈</h1> <h1>555555555555555555555555555555555555</h1> {%endblock main%}

 

父模板 01base.html

<!DOCTYPE html>
<html>
    <head>

         {%load staticfiles%}
        <meta charset="UTF-8">
        <title></title>

        <!-- <script type="text/javascript" src="/static/webpage/js/jquery1.js" ></script> -->
         <!-- 引用静态的方式-->
        <script type="text/javascript" src="{%static 'webpage/js/jquery1.js'%}" ></script>

        <link rel="stylesheet" type="text/css" href="{%static 'webpage/css/aa.css'%}">
    </head>
    <body>

     <div class="outer">
       <div class="nav">管理系统!!</div>
       <div class="left">
            <div class="student manage"><a href="/myapp/st/">学生管理</a></div>
            <div class="teacher manage"><a href="">老师管理</a></div>
            <div class="course  manage"><a href="">课程管理</a></div>
            <div class="classes manage"><a href="">班里管理</a></div>
       </div>
   
        <div class="content">
        {% block content %}
             <h1>welcome To Login  !!!</h1>
        {% endblock %}
        </div>
     </div>
   
    </body>
</html>

03test.html其他页面

<!DOCTYPE html>
<html>
<head>

<meta charset="UTF-8">
<title></title>


</head>
<body>
<h1 style="color:yellow;"> hello word !!!!!!!!!!!!!</h1>

</body>
</html>

 

子模版 aa.html

{%extends "html_app/01base.html"%}
{%load staticfiles%}    <!-- 03   去加载其他的页面  引用这个-->

{% block content %}

         {{block.super}}   <!-- 继承父类模板的数据 --> 
         {%for li in student_list%}
            <h2>学生{{li}}</h2>
         {%endfor%}
{
%include "html_app/03test.html" %} <!-- 03 去加载其他的页面 > {% endblock %}

 

 

 

 

父模板 aa.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>母模板</title>
</head>
<body>
<section>
    <h1>顶部导航</h1>
    <p>python自动化-上海-悠悠</p>
    <hr>
</section>

<!--这是一段注释。block是一个块标签, content是标签名称-->
{% block content %} {% endblock content %}
<p>---------自动化教程---------</p>


<!--这是一段注释。block是一个块标签, ad是标签名称-->
{% block ad %} {% endblock ad %}


<section>
    <br><br><br><br><hr>
    <h1>底部导航</h1>
    <p>底部一些友情链接啊,网站导航,版权啊</p>
</section>
</body>
</html>
子模版 bb.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>子页面</title> </head> <body> <!--这是一段注释。extends继承aa.html页面--> {% extends "aa.html" %} {% block content %} <p>这里是content块的填充内容</p> {% endblock content %}

{
% block ad %} <ul>自动化内容</ul> {% for i in ads %} <li>{{i}}</li> {% endfor %} {% endblock ad %}
</body> </html>

注意: 在父模板中

也可以给块标签添加默认值,如:
<!--这是一段注释。block是一个块标签, 可以给默认值--> {% block defaut %} <p>如果子页面中,没填充此block内容,这里的就是默认内容</p> {% endblock defaut %}

 

posted @ 2019-08-14 02:49  supreme999  阅读(479)  评论(0编辑  收藏  举报