zoukankan      html  css  js  c++  java
  • 第四篇Django之模板语言

    Django之模板语言

    一 模板的执行

    模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户

    def current_datetime(request):
        now = datetime.datetime.now()
        html = "<html><body>It is now %s.</body></html>" % now
        return HttpResponse(html)
    直接放在views里
    

    二 模板语言

    2.1 变量 

    只需要记两种特殊符号

    {{    }}   变量相关      {%  %}  逻辑相关

    示例一:显示一个基本的字符串在网页上

    views.py

    def text_str(resquest):
        str = '我在学习Django'
        return render(resquest, 'home.html', {'str': str})
    

    home.html

    {{ str }}
    

    2.2 Django模板中的for循环标签

    示例二(1):基本的for循环和list的内容

    views.py

    def text_list(resquest):
        list=['HTML','CSS','jquery','MySQL','python','Django']
        return render(resquest, 'home.html', {'list': list})
    

    home.html 

    {{ list }}                  得到一个列表
    =================================================
    {% for i in list %}
    {{ i }}                     得到具体的值
    {% endfor %}

    示例二(2):dict的内容

    views.py

    def text_dic(resquest):
        dic={1:'HTML',2:'CSS'}
        return render(resquest, 'home.html', {'dic':dic})

    home.html  

    {{ dic.1 }} ---------- dic.key
    

    在模板中取字典的键用 dic.1    而不是Python中的 dic['1']  

    还可以这样遍历字典:

    {% for key,value in dic.items %}
        {{ key }}:{{ value }}
    {% endfor %}
    

    其实就是在遍历这样一个list:[(1,'HTML')(2,'CSS')]  

    示例三 在模板进行 条件判断和for循环的详细操作

    views.py 

    def text_for(request):
        List = map(str, range(100))# 一个长度为100的 List
        return render(request, 'home.html', {'List': List})
    

    home.html

    不加任何符号

    {% for item in List %}
        {{ item }}
    {% endfor %}
    
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
    结果

    加一个逗号

    {% for item in List %}
        {{ item }},
    {% endfor %}
    
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
    结果

    我们会发现最后一个元素后面也有一个逗号,这样肯定不爽,如何判断是不是遍历到了最后一个元素了呢?

    用变量 forloop.last 这个变量,如果是最后一项其为真,否则为假,更改如下: 

    {% for item in List %}
        {{ item }}{% if not forloop.last %},{% endif %}
    {% endfor %}
    在for循环里面还有很多有用的东西
    Variable Description
    forloop.counter 当前循环的索引值(从1开始)
    forloop.counter0 当前循环的索引值(从0开始)
    forloop.revcounter 当前循环的倒序索引值(从1开始)
    forloop.revcounter0 当前循环的倒序索引值(从0开始)
    forloop.first 当前循环是不是第一次循环(布尔值)
    forloop.last 当前循环是不是最后一次循环(布尔值)
    forloop.parentloop 本层循环的外层循环

    示例四 (1) 当列表中可能为空时用 for ...empty

    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% empty %}
        <li>抱歉,列表为空</li>
    {% endfor %}
    </ul>
    

    (2) if,elif 和 else

    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}
    

    (3)当然也可以只有if和else  

    {% if user_list|length > 5 %}
      七座豪华SUV
    {% else %}
        黄包车
    {% endif %}

    2.3 Django模板中的条件判断标签

    示例五 if语句支持==、>、<、!=、<=、>=判断  

    {% if var >= 90 %}
    成绩优秀
    {% elif var >= 80 %}
    成绩良好
    {% elif var >= 70 %}
    成绩一般
    {% elif var >= 60 %}
    需要努力
    {% else %}
    不及格啊,大哥!多学习啊!
    {% endif %}

    注意:比较符号前后必须有至少一个空格!

    and, or, not, in, not in 也可以在模板中使用  

    假如我们判断 num 是不是在 0 到 100 之间: 

    {% if num <= 100 and num >= 0 %}
    num在0到100之间
    {% else %}
    数值不在范围之内!
    {% endif %}
    

    我们判断‘某某’在你不在一个列表中 

    {% if '某某' in List %}
    某某在名单中
    {% endif %}
    

    示例六 模板上得到视图对应的网址

    # views.py
    def add(request, a, b):
        c = int(a) + int(b)
        return HttpResponse(str(c))
     
     
    # urls.py
    urlpatterns = patterns('',
        url(r'^add/(d+)/(d+)/$', 'app.views.add', name='add'),
    )
     
     
    # template html
    {% url 'add' 4 5 %}
    

    这样网址上就会显示出:/add/4/5/ 这个网址,假如我们以后修改 urls.py 中的 

    r'^add/(d+)/(d+)/$'
    

    这一部分,改成别的,比如  

    r'^jiafa/(d+)/(d+)/$'
    

    这样,我们不需要再次修改模板,当再次访问的时候,网址会自动变成 /jiafa/4/5/  

    示例七  取别名 

    两种方法

    ① 

    {% url 'some-url-name' arg arg2 as the_url %}
     
    <a href="{{ the_url }}">链接到:{{ the_url }}</a>
    

    ②  

    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    

    实例八,模板中 获取当前网址,当前用户等:  

    8.1 获取当前用户

    {{ request.user }}
    

    如果登陆就显示内容,不登陆就不显示内容

    {% if request.user.is_authenticated %}
        {{ request.user.username }},您好!
    {% else %}
        请登陆,这里放登陆链接
    {% endif %}
    

    8.2.1 获取当前网址

    {{ request.path }}
    

    8.2.2 获取当前 GET 参数

    {{ request.GET.urlencode }}
    

    8.2.3 合并到一起用的一个例子

    <a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>
    

    比如我们可以判断 delete 参数是不是 1 来删除当前的页面内容  

    2.4 Django模板中的过滤器(Filters)的使用

    语法:

    {{ name|lower }}
    

    示例

    views.py

    def home(request):
        name = ['HTML','CSS','jquery','MySQL','python','Django']
        return render(request, 'home.html', {'name': name})
    

    home.html

    {{ name|lower}}
    

    =========================  

    其他用法

    1 default

    语法:

    {{ value:default: "nothing"}}

    views.py

    def home(request):
        name2 = []
        return render(request, 'home.html', {'name': name})

    home.html

    {{ name:default: "nothing"}}
    

    2 length  

    语法:  

    {{ value|length }}
    

    views.py  

    def home(request):
        name = ['HTML','CSS','jquery','MySQL','python','Django']
        return render(request, 'home.html', {'name': name})
    

    home.py  

    {{ name|length }}
    

    '|'左右没有空格没有空格没有空格  

    3 filesizeformat  

    将值格式化成为一个‘人类可读的’文件尺寸(例如‘13KB’,'4,1MB',等待)

    语法:

    {{ value|filesizeformat }}
    

    views.py  

    def home(request):
        name = 123456789
        return render(request, 'home.html', {'name': name})

    home.py

    {{ name|filesizeformat }}
    

    4 slice切片

    语法:

    {{value|slice:"2:-1"}}

    views.py  

    def home(request):
        name = ['HTML','CSS','jquery','MySQL','python','Django']
        return render(request, 'home.html', {'name': name})

    home.py

    {{ name|slice:'0:4' }}

    5 data  

    语法:

    {{ value|date:"Y-m-d H:i:s"}}

    views.py  

    import datetime

    def home(request):
        name = datetime.datetime.now()
        return render(request, 'home.html', {'name': name})

    home.py

    {{ name|date:'Y-m-d' }}

    6 safe  

     Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义

    语法:

    {{ value|safe}}

    views.py  

    def home(request):
        value = "<a href='https://www.baidu.com/'>点我</a>"
        return render(request, 'home.html', {'value': value})

    home.py

    {{ value|safe}}

    7 truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:截断的字符数

    语法:

    {{ value|truncatechars:9}}

    views.py  

    def home(request):
        value = "2018年3月28日外交部发言人"
        return render(request, 'home.html', {'value': value})

    home.py

    {{ value|truncatechars:9}}

    8 自定义fllter  

    ① 在app中创建templatetags 文件夹 (必须的

    ②创建任意的 .py 文件,如:my_tags.py

    from django import template
    register = template.Library()    #register的名字是固定的,不可改变
    @register.filter() 
    def filter_multi(v1,v2):
      return v1 * v2

    在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

    ④views.py里

    def home(request):
        num=12
        return render(request, 'home.html', {'num': num})

    ⑤ 使用simple_tag和filter(如何调用)

    -------------------------------.html
    {% load xxx %}   #首行
     # num=12
    {{ num|filter_multi:2 }} #24

    在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

    注意:

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

    {% if num|filter_multi:30 > 100 %}
        {{ num|filter_multi:30 }}
    {% endif %}
    

    ===simple_tag===

    my_tags.py

    from django import template
    register = template.Library()
    
    @register.simple_tag()
    def simple_tag_multi(v1,v2,v3):
        return  v1*v2*v3

    views.py

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

    home.html

    {% load my_tags %}
    
    {% simple_tag_multi 2 5 2%}
    

    9 csrf_token

    这个标签用于跨站请求伪造保护。

    在页面的form表单里面写上{% csrf_token %} 

    例子:钓鱼网站

    10 注释

    {# ... #}
    

    三 母板  

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>Title</title>
      {% block page-css %}
      
      {% endblock %}
    </head>
    <body>
    
    <h1>这是母板的标题</h1>
    
    {% block page-main %}
    
    {% endblock %}
    <h1>母板底部内容</h1>
    {% block page-js %}
    
    {% endblock %}
    </body>
    </html>
    

    注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

    继承母板

    在子页面中在页面最上方使用下面的语法来继承母板  

    {% extends 'layouts.html' %}
    

    块  

    通过在母版中使用 {%block xxx%} 来定义‘块’

    在子夜中通过定义母版中的block名来对应替换母版中相应的内容

    母版html里

    {% block page-main %}
    
    {% endblock %}
    

    对应的html

    {% block page-main %}
      <p>世情薄</p>
      <p>人情恶</p>
      <p>雨送黄昏花易落</p>
    {% endblock %}
    

    组件  

    可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可

    {% include 'navbar.html' %}

    配置css/js 文件时

    母版html

    {% block page-css %}{% endblock %}
    ---------------------------------------------------------------
    {% block page-js %}{% endblock %}
    

    相应的html  

    {% block page-css %}
        <link href="/static/css/dashboard.css" rel="stylesheet">
    {% endblock %}
    ------------------------------------------------------------
    {% block page-js %}
        <script src="/static/jquery-3.2.1.min.js"></script>
    {% endblock %}

    静态文件相关

    导入文件

    {% load static %}
    <img src="{% static "img/img/sms.ivo" %}">
    

    导入JS文件使用 

    {% load static %}
    <script src="{% static "mytest.js" %}"></script>
    

    某个文件多处被用到可以存为一个变量

    {% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img>
    

    另一种方法get_static_prefix 

    {% load static %}
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
    

    或者

    {% load static %}
    {% get_static_prefix as STATIC_PREFIX %}
    
    <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
    <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

    inclusion_tag

    示例

    templatetags/my_inclusion.py

    from django import template
    register = template.Library()
    
    
    @register.inclusion_tag('result.html')
    def show_results(n):
      # 三元运算
        n = 1 if n < 1 else int(n)
        data = ["第{}项".format(i) for i in range(1, n+1)].....//[第1项,第2项]
        return {"data": data}

    templates/snippets/result.html

    <ul>
      {% for i in data %}
        <li>{{ i }}</li>
      {% endfor %}
    </ul>

    templates/index.html  

    {% load inclusion_tag_test %}
    
    {% show_results 10 %}
    

      

  • 相关阅读:
    Ubuntu分区挂载
    YOLOv3:Demo needs OpenCV for webcam images
    tf.strided_slice函数
    numpy:np.random.seed()
    python:split()函数
    python:set() 函数
    python:zip() 函数
    python:enumerate 函数
    电脑无法上网,DNS出现fec0:0:0:ffff::1%1问题
    python:map 函数
  • 原文地址:https://www.cnblogs.com/a438842265/p/8671041.html
Copyright © 2011-2022 走看看