Django—模板层

变量的使用

{{ }}:变量相关

{% %}:逻辑相关

def test(request):
    num =1
    s = 'hello'
    li = [1,2,['a','b']]
    dic = {'name':'zyl','password':'123'}
    tup = (1,2,3,4)
    se = {1,2,3}
    def my_test():
        return '你是猪'
    class test1:
        def __init__(self,name):
            self.name=name
        @classmethod
        def classM(cls):
            return '我是类方法'
        @staticmethod
        def staM():
            return '我是静态方法'
        def get_name(self):
            return self.name

        def __str__(self):
            return '大帅比'
    t=test1('zyl')
    return render(request,'test.html',locals())

后端朝前端页面传递数据的方式

第一种

return render(request,'index.html',{'n':n})

第二种

return render(request,'index.html',locals())  

在views中定义上面的函数,locals()是将当前所在的名称空间中的名字全部传递给前端页面

后端传函数名到前端,会自动加括号调用,但是不支持传参,后端传对象到前端,就相当于打印了这个对象

上图传入的变量有:整型,字符串,列表,字典,集合,元组,无参函数,类的对象

前端test.html

<h1>day57</h1>
<p>数字:{{ num  }}</p>
<p>字符串{{ s }}</p>
<p>列表:{{ li }}</p>
<p>字典:{{ dic }}</p>
<p>元组:{{ tup }}</p>
<p>集合:{{ se }}</p>
<p>函数:{{ my_test }}</p>
<p>对象:{{ t }}</p>   #得到的结果是一个内存地址,可以用__str__修改
<p>对象属性:{{ t.name }}</p>
<p>对象函数:{{ t.get_name}}</p>
<p>类函数:{{ t.classM}}</p>
<p>全局函数:{{ t.staM}}</p>

前端获取后端传过来的容器类型的内部元素 统一采用句点符(.)

{{ li }},{{ li.1 }}  数字对应的就是数据的索引

 模板中支持的写法:

注意:传进来的函数一定不能是含参函数

模板语法的注释

  不会展示到前端页面

原生html的注释
  会展示到前端

Filter(过滤器)

语法:{{value|filter_name:参数}}

'|'左右没有空格!

 过滤器会把左边的值当做一个个参数传给右边的过滤器,过滤器后面的值会当做第二个参数传递给过滤器

常用过滤器:

1、default:

{{ flag|default: "没东西"}}

如果value没有值就限时‘没东西’

2、leagth:

{{ li|length }}

返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

3、filesizeformat

将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)

{{ file_size|filesizeformat }}

4、slice

从索引为0切到索引为4,不保留4,前闭后开,后面的参数可以为负数

5、date

格式化(不加%号)

from datetime import datetime
    ctime = datetime.now()

6、truncatechars

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

参数:截断的字符数

{{ s|truncatechars:7}}

其中...也计算在内

7、truncatewords

和truncatechars不同,这是按照空格的数量截断的,同样的。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数:截断的字符数

{{ s|truncatewords:3}}

其中...不算3个字符位置

8、safe(********)

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

前端取消转义

{{ h1|safe}}

后端取消转义

from django.utils.safestring import mark_safe
    h1=mark_safe('<h1>我就是我</h1>')

9、add

num作为第一个参数,2作为第二个参数相加 如果两个都是数字的话就相加,如果其中有一个是字符串的话结果为‘ ’空

如果两个参数都是字符串,执行字符串相加

标签

for循环

{% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
    <p>{{ foo }}</p>
{% endfor %}

结果:

{% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
{#    <p>{{ foo }}</p>#}
    <p>{{ forloop }}</p>
{% endfor %}

结果:

这是一个自定义对象  first,last标识当前for循环是第一次还是最后一次,如果是返回True,否则False

count0:类似索引,后端枚举enumerate,

if判断

% if l %}
    <p>这个l有值</p>
{% else %}
    <p>这个l没值</p>
{% endif %}

嵌套使用

% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
{% if forloop.first %}
    <p>这是我的第一次</p>
{% elif forloop.last%}
    <p>最后一次</p>
    {% else %}
    <p>继续嗨</p>
{% endif %}

结果:

empty

当你的for循环对象为空的时候会自动走empty代码块儿的内容
后端:
l = None

前端

{% for foo in l %} {# l = [1,2,3,4,5,6,7] #}
{% if forloop.first %}
    <p>这是我的第一次</p>
{% elif forloop.last%}
    <p>最后一次</p>
    {% else %}
    <p>继续嗨</p>
{% endif %}
    {% empty %}
    <p>你给我的l为空不能for循环</p>
{% endfor %}

字典for循环

{% for foo in dic %} {# l = [1,2,3,4,5,6,7] #}
{{ foo }}
{% endfor %}
<p>一</p>
{% for foo in dic.keys %}
    {{ foo }}
{% endfor %}
<p>二</p>
{% for foo in dic.values %}
{{ foo }}
{% endfor %}
<p>三</p>
{% for foo in dic.hobby.0 %}
{{ foo }}
{% endfor %}
<p>四</p>
{% for foo in dic.items %}
{{ foo }}
{% endfor %}

结果:

模板with用法

% with dic.hobby.2 as h %}
{{ h }} 
{% endwith %}
{{ dic.hobby.2 }}

给复杂获取值得代码重命名,方便下次使用

注:重命名的变量只能在with里面使用

自定义过滤器

必须做的三件事

1.在应用名下新建一个名为templatetags文件夹(必须叫这个名字)
2.在该新建的文件夹内新建一个任意名称的py文件
3.在该py文件中需要固定写下面两句代码
from django import template        
register = template.Library()

 自定义过滤器

@register.filter(name='baby')
def mu_sum(a,b):
    return a+b

使用方法

{% load my_tag  %}
{{ xxx|baby:10 }}  {# xxx+10 #}

自定义标签

@register.simple_tag(name='plus')
def plus(a,b,c):
    return '%s-%s-%s'%(a,b,c )

使用方法

{% load my_tag  %}
{{ xxx|baby:10 }}  {# xxx+10 #}
{% plus xxx 'egon' 'zyl'  %}

注意:自定义的过滤器可以在if和for中使用,但是自定义的标签不能使用

自定义inclusion_tag

调用自定义的inclusion_tag能够返回一段html代码、

比如form表单,表格,列表
通常用于动态生成的HTML页面
@register.inclusion_tag('login.html',name='login')
def login(n):
    # l = []
    # for i in range(n):
    #     l.append('第%s项'%i)
    l = [ '第%s项'%i for i in range(n)]
    return {'l':l}
# login.html
    <ul>
        {% for foo in l %}
        <li>{{ foo }}</li>
        {% endfor %}
    </ul>
# 调用
{% login 5 %}

结果:

注意 :要想使用自定义的过滤器 标签 inclusion_tag 必须先在需要使用的html页面加载你的py文件

模板的继承与导入

首先需要在被继承的模板中划分多个区域

{% block 给区域起的名字 %}

{% endblock %}

通常情况下一个模板中应该至少有三块

{% block css %}
    页面css代码块
{% endblock %}

{% block js %}
    页面js代码块
{% endblock %}

{% block content %}
    页面主体内容
{% endblock %}

子板继承模板

先继承模板所有的内容
{% extends 'home.html' %}

然后根据block块的名字修改指定区域的内容
{% block content %}
    <h1>登录页面</h1>
        <form action="">
            <p>username:<input type="text" class="form-control"></p>
            <p>password:<input type="text" class="form-control"></p>
            <input type="submit" class="btn btn-success">
        </form>
{% endblock %}

模板的导入:将一段html当做模块的方式导入到另一个html展示

{% include '想导入的html文件名' %}

静态文件配置

{% load static %}  

<link rel='stylesheet' href="{% static 'css/mycss.css'%}">  # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">  # 第二种方式

猜你喜欢

转载自www.cnblogs.com/zhengyuli/p/11005490.html
今日推荐