Django学习笔记之模板功能

  简介:                                                                                                                             

    在Django中模板主要就是前端展示页面,除了写一些HTML、css、JavaScript代码之外,我们还可以使用“模板”功能,将后台传过来的数据进行处理后,在显示在页面上。

    模板功能主要分为标签过滤器,主要的表现形式为 {{  }} 和  {% %},变量相关用 {{  }},逻辑相关用{%  %}。

  一、标签                                                                                                                        

    标签又分为 内置标签自定义标签 两种。

    1、内置标签

      这里只列举一些常用的内置标签,其他的标签可以跳转到内置标签

      csrf_token                                                                                                     

        这个标签用于跨站请求伪造保护,在form表单里面加上{% csrf_token %},可以通过Django的跨站请求伪造的保护。

      注释                                                                                                              

        使用{#    #}来填写注释内容。

      block、extend、include                                                                                

 

       都是用在模板继承里面,下面会介绍。

      for                                                                                                                 

          循环遍历数组、字典的值。

        例如:

        <ul>

        {% for student in studetn_list %}

           <li>{{ student.name }}</li>

        {% endfor %}

        </ul> 

        如果想要反向循环列表的话,可以使用reversed关键字,{% for student in studetn_list  reversed %}。

        如果是字典的话,还可以直接取出字典的键和对应的值:

         {% for key,value in dict_list %}

          {{key}}:{{value}}

         {% endfor %}

        这里遍历字典的话,需要注意一下,如果该字典的某个键的名称同时又是字典的某个方法名(比如:items),那么使用data.items将

     返回的是items这个键在字典中对应的值,而不是data.items()这个方法返回的内容,归纳为:点运算符(.)的字典键查找优先于方法查找

        for循环还可以使用内置的一些参数:

        

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的父循环

          for........empty    如果返回的结果为空或者无法找到,则会运行 {% empty %}。

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

        if                                                                                                                  

        输出符合条件的内容:

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

         if标签支持:and、or、not、in、not in 、is、is not、==、!=、>、<、>=、<=。

       with                                                                                                                  

       以更简单的名称来代替复杂的变量名称。 

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

    2、自定义标签(简单标签和包含标签)

      简单标签(simple_tag):

        a、在应用下面新建一个文件夹templatetags,在文件夹下面新建自定义标签的py文件。

          

        b、编写你的simple_tag要实现的功能代码:

 

from django import template    #导入Django的template模块

register = template.Library()  # 实例化模板的Library类


@register.simple_tag(name='current_time')  # 注册该方法为simple_tag
def your_name(name):
    return "This is {}".format(name)

 

        c、在模板文件中调用自定义的标签:

{% load app01_simpletags %}    {# 载入你的自定义标签文件 #}
{# 自定义的simple_tag   并传入参数 #}
<h1>{% your_name '三炮' %}</h1>

      包含标签(inclusion_tags)

      inclusion_tags多用于返回一段HTML代码。

      a、在上面建的文件夹templatetags下,新建一个py文件;

        b、编写自定义inclusion_tags代码:

from django import template   #导入Django的template模块

register = template.Library()   #实例化一个Library类


@register.inclusion_tag('3.html')    #绑定一个HTML代码片段
def num_list(n):
    n = 1 if n<1 else int(n)
    data_list = ["This is {}".format(i) for i in range(1,n+1)]
    return {'data_list':data_list}   #返回结果给绑定的HTML代码段

        c、编写需要绑定的HTML代码片段:

<ul>
    {% for choice in data_list %}   {# 这个data_list 指的是返回的键值对中的键 #}
    <li>{{ choice }}</li>
    {% endfor %}
</ul>

        d、在模板中使用 inclusion_tags:

{% load app01_inclusiontags %}  {# 载入你的自定义标签文件 #}
{# 调用自定义的inclusion_tag   并传入参数 #}
{% num_list 6 %}

  二、过滤器                                                                                                                          

    1、内置过滤器

      default                                                                                                                                

          {{ value|default 'nothing' }},如果value没有值的话,就显示nothing。

        length                                                                                                                                

         {{value|length}},返回value的长度。

       filesizeformat                                                                                                                     

         {{value|filesizeformat}}将一个人类可读的值格式化为一个表示文件大小的格式,比如:如果value是123456789,则输出为117.7MB。

       slice                                                                                                                                    

         {{value|slice:'0:2'}}返回一个切片后的值,切片规则和python一样。

       date                                                                                                                                    

         {{value|date:"格式字符串"}}   根据格式字符串格式化日期。

        一般使用的格式为{{value|date:"Y-m-d H:i:s"}},其他可用的"格式字符串"可以查看格式化字符串

       safe                                                                                                                                    

         为了安全起见,Django默认不会将后台传过来的包含HTML格式的值自动转化HTML,如果想将包含HTML代码的值转化,有要用safe。

       {{value|safe}}  例如:value的值为"<p>123</p>"。

       truncatechars                                                                                                                    

         如果后台传过来的值太长,不想全部都展示到前台的话,可以使用这个过滤器,将不想显示的部分用省略号来代替。

       {{value|truncatechars:9}}  这个是只显示value长度为9的内容,其他内容用省略号来代替。

     其他的内置过滤器可以去看Django内置过滤器参考

    2、自定义过滤器

        创建自定义过滤器的步骤和上面创建自定义标签的步骤差不多,需要注意的是自定义的过滤器只能接收一个或者两个参数(其中

       第一个参数是使用这个过滤器的变量,第二个参数是需要传的参数),而自定义标签可以接收多个参数。

        a、在新建的文件夹templatetags下,新建一个py文件;

        b、编写自定义过滤器的代码:

from django import template  # 导入Django的template模块

register = template.Library()  # 实例化一个Library类


@register.filter(name='cut')  # 注册为一个过滤器并命名
def cut(value, arg):
    return value.replace(arg, 'hahaha')


@register.filter  # 注册为一个过滤器不命名,默认使用函数名
def lower1(value):
    return value.lower();

         c、在模板中使用自定义的过滤器:

{% load app01_filter %}    {# 载入你的自定义标签文件 #}

{# 调用自定义的过滤器  并传入参数 #}
<h1>{{ somevariable|cut:'some' }}</h1>
{# 调用自定义的过滤器 ,只有当前变量作为参数 #}
<h1>{{ THISISRIGHT|lower1 }}</h1>

 

三、母板                                                                                                                                                   

     为了避免写重复的代码,所以再写模板的时候,我们会使用母板,主要就是把重复的部分摘出来单独放在一个文件里,然后让其余

    文件去调用。

    在母板文件中,我们主要使用的标签是block,主要就是在子板继承的时候,能够自定义不同的部分。比如我们如下定义的Base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

     那么,子板在继承母板的时候,需要这样写:

{% extends "base.html" %}                        #声明要继承的母板

{% block title %}My amazing blog{% endblock %}   #替换了title里面的内容
                              #sidebar没有重写,所以继承了母板的内容
{% block content %}                              #填充了content里面的内容
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

      我们还可以把单独的一个功能封装到一个文件里,然后让其他的文件来直接调用:

{% include 'navbar.html' %}    #使用include标签来调用其他的文件

 

四、静态文件路径的其他写法                                                                                                              

    1、直接写路径

<script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
<script type="text/javascript" src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>

    2、加载静态文件存放的文件夹

{% load static %}
<script type="text/javascript" src="{% static "jquery-3.3.1.js" %}"></script>
<script type="text/javascript" src="{% static "bootstrap-3.3.7/js/bootstrap.min.js" %}"></script>

    3、如果某个文件被用到多次,可以给它一个名字

{% load static %}
{% static "jquery-3.3.1.js" as jquery %}
<script type="text/javascript" src="{{ jquery }}"></script>

    4、使用get_static_prefix来获取路径

{% load static %}
<script type="text/javascript" src="{% get_static_prefix %}jquery-3.3.1.js"></script>

    或者

{% load static %}
{% get_static_prefix as static_prefix %}
<script type="text/javascript" src="{{ static_prefix }}jquery-3.3.1.js"></script>

 

posted @ 2018-08-27 18:07  人生需要激情  阅读(99)  评论(0)    收藏  举报