Django05 - 模板层

一:前后端交互编码方式

1.urlencoded

form表单默认是urlencoded编码格式传输数据

数据格式:username=Darker&password=123456

django会将该格式的数据 自动解析并打包到request.POST

2.form-data

数据分为2部分:数据文件

数据部分:username=Darker&password=123456
-----分隔-----
文件部分(二进制)

数据 自动解析并打包到request.POST

文件 自动解析并打包到request.FILES

3.json

django后端针对json格式数据 并不会做任何的处理,而是直接放在request.body

# request.body

{
    "username": "Darker",
    "password": "123456"
}

二:Django模板使用的2种方式

模板渲染的数据示例

# 模板

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>{{ word }}</h1></div>
    <div class="panel-body text-center">
    	<h1>{{ current_time }}</h1>
    </div>
</div>

方式1

import datetime

def test(request):
    now = datetime.datetime.now()
    return render(request, 'test.html', context={'current_time': str(now), 'word': 'Hello World'})

方式2 - 页面静态化

import datetime

def test(request):
    now=datetime.datetime.now()
    from mysite import settings
    import os
    path=os.path.join(settings.BASE_DIR,'templates','test.html')
    ss=open(path,'r',encoding='utf-8').read()
    t=Template(ss)
    c=Context({'current_date':str(now),'word': 'Hello World'})
    html=t.render(c)  # html是渲染后的字符串
    return HttpResponse(html)now=datetime.datetime.now()

三:变量

DTL:Django Template Language(Django模板语言)

def test(request):
    x_num = 666
    x_str = 'Hello World'
    x_bool = True
    x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd':123}, 7]
    x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
    x_set = {1, 2, 3, 4, 5}
    x_tuple = (9, 8, 7, 6, 5)

    def x_func():
        print('I\'m function-print')
        return 'I\'m function-return'

    class X_Info(object):
        def __init__(self, name):
            self.name = name

        def print_name(self):
            return self.name

        def __str__(self):
            return self.name

    x_obj = X_Info('Darker')

    return render(request, 'test.html', locals())  # locals() 把当前作用域下所有的变量,都传到context中
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>变量</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>Num:{{ x_num }}</li>
            <li>Str:{{ x_str }}</li>
            <li>Bool:{{ x_bool }}</li>
            <li>List:{{ x_list }}</li>
            <li>Dict:{{ x_dict }}</li>
            <li>Set:{{ x_set }}</li>
            <li>Tuple:{{ x_tuple }}</li>
            <li>Function:{{ x_func }}</li>
            <li>Class:{{ X_Info }}</li>
            <li>Class_Obj:{{ x_obj }}</li>
        </ul>
    </div>
</div>

结论:

  • 基本数据类型都可以传输
  • 函数需要retuen
  • 类无法传输,也无法打印内存地址
  • 类实例化的对象可以传输,但是需要在类中定义__str__

四:句点符查询

直接用.来操作

# views.py


from django.utils.safestring import mark_safe

def test(request):
    x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd':123}, 7]
    x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
    x_set = {1, 2, 3, 4, 5}
    x_tuple = (9, 8, 7, 6, 5)
    x_link1 = '<a href="http://www.xuexianqi.top">Click Here</a>'
    x_link2 = mark_safe(x_link1)
    x_inp1 = '<br><input type="text" name="name">'
    x_inp2 = mark_safe(x_inp1)
    x_script1 = '<script>alert("弹窗警告!")</script>'
    x_script2 = mark_safe(x_script1)

    def x_func():
        print('I\'m function-print')
        return 'I\'m function-return'

    class X_Info(object):
        def __init__(self, name):
            self.name = name

        def print_name(self):
            return self.name

        def __str__(self):
            return self.name

    x_obj = X_Info('Darker')

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>变量</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>列表的第2个元素:{{ x_list.1 }}</li>
            <li>列表第3个元素的值:{{ x_list.2.usr }}</li>
            <li>字典中name的值:{{ x_dict.name }}</li>
            <li>集合的第4个元素:{{ x_set.3 }}</li>
            <li>元组的第5个元素:{{ x_tuple.4 }}</li>
            <li>执行函数x_func:{{ x_func }}</li>
            <li>调用对象x_obj的方法:{{ x_obj.print_name }}</li>
            <li>调用对象x_obj的属性:{{ x_obj.name }}</li>
            <li>a标签字符串1:{{ x_link1 }}</li>
            <li>a标签字符串2:{{ x_link2 }}</li>
            <li>输入框1:{{ x_inp1 }}</li>
            <li>弹窗警告1:{{ x_script1 }}</li>
            <li>弹窗警告2:{{ x_script2 }}</li>
        </ul>
    </div>
</div>

x_script2的弹窗

结论:

  • 列表、元组、集合 可以.索引取值
  • 集合无法.索引取值,因为集合是无序的
  • 字典取值直接.,而不是.get()或者[]
  • 函数和类可以.属性和方法来执行
  • mark_safe()包裹的标签 被认为是安全的,可以被渲染
  • mark_safe()需要导入:from django.utils.safestring import mark_safe

五:过滤器

语法:{{obj|filter__name:param}} 变量名字|过滤器名称:变量

default - 设置默认值

如果一个变量是false或者为,使用给定的默认值。否则,使用变量的值。

语法:{{ value|default:"nothing" }}

# views.py

def test(request):
    x_num0 = 0
    x_num1 = 1
    x_bool_t = True
    x_bool_f = False
    x_emp_dic = {}
    x_emp_list = []

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>default</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_num0:{{ x_num0|default:"我是默认值" }}</li>
            <li>x_num1:{{ x_num1|default:"我是默认值" }}</li>
            <li>x_bool_t:{{ x_bool_t|default:"我是默认值" }}</li>
            <li>x_bool_f:{{ x_bool_f|default:"我是默认值" }}</li>
            <li>x_emp_dic:{{ x_emp_dic|default:"我是默认值" }}</li>
            <li>x_emp_list:{{ x_emp_list|default:"我是默认值" }}</li>
        </ul>
    </div>
</div>

结论:

  • bool值为False,使用默认值
  • 数值为0,使用默认值
  • 空列表,使用默认值
  • 空字典,使用默认值
  • 其余全部使用变量原来的值

length - 返回长度

返回值的长度,对可迭代对象有效

# views.py

def test(request):
    x_num = 666
    x_str = 'Hello World'
    x_bool = True
    x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd': 123}, 7]
    x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
    x_set = {1, 2, 3, 4, 5}
    x_tuple = (9, 8, 7, 6, 5)

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>default</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_num:{{ x_num|length }}</li>
            <li>x_str:{{ x_str|length }}</li>
            <li>x_bool:{{ x_bool|length }}</li>
            <li>x_list:{{ x_list|length }}</li>
            <li>x_dict:{{ x_dict|length }}</li>
            <li>x_set:{{ x_set|length }}</li>
            <li>x_tuple:{{ x_tuple|length }}</li>
        </ul>
    </div>
</div>

结论:

  • 数字、布尔类型 不能计算长度
  • 列表、字典、元组、集合、字符串 都可以计算长度

filesizeformat - 返回大小

将值格式化为一个人类可读的文件尺寸

# views.py

def test(request):
    x_num1 = 1
    x_num2 = 8
    x_num3 = 1024
    x_num4 = 1024*10
    x_num5 = 1024**2
    x_num6 = 1024**3
    x_num7 = 1024**4
    x_num8 = 1024**5
    x_str = 'Hello World'
    x_bool = True
    x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd': 123}, 7]
    x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
    x_set = {1, 2, 3, 4, 5}
    x_tuple = (9, 8, 7, 6, 5)

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>default</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_num1:{{ x_num1|filesizeformat }}</li>
            <li>x_num2:{{ x_num2|filesizeformat }}</li>
            <li>x_num3:{{ x_num3|filesizeformat }}</li>
            <li>x_num4:{{ x_num4|filesizeformat }}</li>
            <li>x_num5:{{ x_num5|filesizeformat }}</li>
            <li>x_num6:{{ x_num6|filesizeformat }}</li>
            <li>x_num7:{{ x_num7|filesizeformat }}</li>
            <li>x_num8:{{ x_num8|filesizeformat }}</li>
            <li>x_str:{{ x_str|filesizeformat }}</li>
            <li>x_bool:{{ x_bool|filesizeformat }}</li>
            <li>x_list:{{ x_list|filesizeformat }}</li>
            <li>x_dict:{{ x_dict|filesizeformat }}</li>
            <li>x_set:{{ x_set|filesizeformat }}</li>
            <li>x_tuple:{{ x_tuple|filesizeformat }}</li>
        </ul>
    </div>
</div>

结论:

  • filesizeformat主要用于数字类型
  • 最小单位是1字节(1bit)
  • bool值True相当于数字1,所以是1字节
  • 列表、字典、元组、集合、字符串 都无法计算大小

date - 返回日期

格式化日期

# views.py

from datetime import datetime

def test(request):
    x_time = datetime.now()

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>date</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_time:{{ x_time|date:"Y-m-d" }}</li>
            <li>x_time:{{ x_time|date:"Y-m-d H-i-s" }}</li>
            <li>x_time:{{ x_time|date:"Y-m-d | H-i-s" }}</li>
            <li>x_time:{{ x_time|date:"Y年m月d日" }}</li>
            <li>x_time:{{ x_time|date:"Y年m月d日 H时i分s秒" }}</li>
            <li>x_time:{{ x_time|date:"Y年m月d日 | H时i分s秒" }}</li>
        </ul>
    </div>
</div>

结论:

  • YH需要大写,其余全部小写
  • date:后面不能出现空格

slice - 切片

顾头不顾尾

# views.py

def test(request):
    x_str1 = '123456789'
    x_str2 = '八进制和十进制其实也差不多,如果你少了两根手指头的话。'
    x_str3 = 'Base eight is just like base ten really, if you\'re missing two fingers.'

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>slice</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_str1  0:5:{{ x_str1|slice:"0:5" }}</li>
            <li>x_str1  1:3:{{ x_str1|slice:"1:3" }}</li>
            <li>x_str1  3:7:{{ x_str1|slice:"3:7" }}</li>
            <li>x_str2  0:5:{{ x_str2|slice:"0:5" }}</li>
            <li>x_str2  1:3:{{ x_str2|slice:"1:3" }}</li>
            <li>x_str2  3:7:{{ x_str2|slice:"3:7" }}</li>
            <li>x_str3  0:5:{{ x_str3|slice:"0:5" }}</li>
            <li>x_str3  1:3:{{ x_str3|slice:"1:3" }}</li>
            <li>x_str3  3:7:{{ x_str3|slice:"3:7" }}</li>
        </ul>
    </div>
</div>

结论:

  • 这个切片和python的切片用法相同,都是顾头不顾尾,下标就是索引0开始的
  • 中英文字符都一样

truncatechars - 最大可现实的字数

如果字符串字符多于指定的字符数量,那么会被截断

截断的字符串将以可翻译的省略号序列(“...”)结尾。

# views.py

def test(request):
    x_str1 = '123456789'
    x_str2 = '八进制和十进制其实也差不多,如果你少了两根手指头的话。'
    x_str3 = 'Base eight is just like base ten really, if you\'re missing two fingers.'

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>truncatechars</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_str1:{{ x_str1|truncatechars:"1" }}</li>
            <li>x_str1:{{ x_str1|truncatechars:"2" }}</li>
            <li>x_str1:{{ x_str1|truncatechars:"3" }}</li>
            <li>x_str1:{{ x_str1|truncatechars:"4" }}</li>
            <li>x_str1:{{ x_str1|truncatechars:"5" }}</li>
            <li>x_str2:{{ x_str2|truncatechars:"3" }}</li>
            <li>x_str2:{{ x_str2|truncatechars:"10" }}</li>
            <li>x_str2:{{ x_str2|truncatechars:"15" }}</li>
            <li>x_str3:{{ x_str3|truncatechars:"3" }}</li>
            <li>x_str3:{{ x_str3|truncatechars:"10" }}</li>
            <li>x_str3:{{ x_str3|truncatechars:"15" }}</li>
        </ul>
    </div>
</div>

结论:

  • 1、2、3都一样............
  • 其余都要减个3
  • 中英文都一样

safe - 语法标签转义

Django的模板中会对HTML标签和JS等语法标签进行自动转义`,原因显而易见,这样是为了安全`。

但是有的时候我们可能不希望这些HTML元素被转义,这时候就用到了safe过滤器了

# views.py

def test(request):
    x_str1 = 'Hello World'
    x_str2 = '<u>Hello World</u>'
    x_str3 = '<a href="https://www.baidu.com">Hello World</a>'

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>safe</h1></div>
    <div class="panel-body ">
        <ul style="line-height: 30px;">
            <li>x_str1 已转义:{{ x_str1 }}</li>
            <li>x_str1 未转义:{{ x_str1|safe }}</li>
            <li>x_str2 已转义:{{ x_str2 }}</li>
            <li>x_str2 未转义:{{ x_str2|safe }}</li>
            <li>x_str3 已转义:{{ x_str3 }}</li>
            <li>x_str 未转义3:{{ x_str3|safe }}</li>
        </ul>
    </div>
</div>

结论:

  • 加上safe,就像之前的mark_safe()包裹住标签一样,被认为是安全的,可以被浏览器渲染

其他过滤器(了解)

六:标签

for标签 - 遍历每一个元素

for循环可以遍历每一个元素

# views.py

def test(request):
    x_str = 'ABCDE'
    x_list = ['Hello', 'Thank', 'You', 'Very', 'Much']
    x_dict = {'name': 'Darker', 'age': 18, 'gander': 'male'}
    x_set = {'a', 'b', 'c'}
    x_tuple = (1, 2, 3)

    return render(request, 'test.html', locals())
# test.html

<div class="row">
        <div class="col-md-7 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading text-center"><h1>for</h1></div>
                <div class="panel-body ">
                    
                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body ">
                                {% for foo1 in x_str %}
                                    <li>{{ foo1 }}</li>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_list</p></div>
                            <div class="panel-body ">
                                {% for foo2 in x_list %}
                                    <li>{{ foo2 }}</li>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_dict</p></div>
                            <div class="panel-body ">
                                {% for foo3 in x_dict %}
                                    <li>{{ foo3 }}</li>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_set</p></div>
                            <div class="panel-body ">
                                {% for foo4 in x_set %}
                                    <li>{{ foo4 }}</li>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_tuple</p></div>
                            <div class="panel-body ">
                                {% for foo5 in x_tuple %}
                                    <li>{{ foo5 }}</li>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_tuple reversed</p></div>
                            <div class="panel-body ">
                                {% for foo5 in x_tuple reversed %}
                                    <li>{{ foo5 }}</li>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                </div>
            </div>
        </div>
    </div>

结论:

  • for循环的元素必须是可迭代对象
  • 集合是无序的,所以每次结果都会不一样
  • 可以利用{% for obj in list reversed %}反向完成循环。

forloop - 添加循环序号

循环序号可以通过{{forloop}}显示

循环 作用
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第1次循环(布尔值)
forloop.last 当前循环是不是最后1次循环(布尔值)
forloop.parentloop 本层循环的外层循环
# views.py

def test(request):
    x_str = 'ABCDE'

    return render(request, 'test.html', locals())
<div class="row">
        <div class="col-md-7 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading text-center"><h1>forloop</h1></div>
                <div class="panel-body text-center">
                    
                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body">
                                {% for foo1 in x_str %}
                                    <p>
                                        {{ forloop.counter }}
                                        |
                                        {{ foo1 }}
                                    </p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body ">
                                {% for foo1 in x_str %}
                                    <p>
                                        {{ forloop.counter0 }}
                                        |
                                        {{ foo1 }}
                                    </p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body ">
                                {% for foo1 in x_str %}
                                    <p>
                                        {{ forloop.revcounter }}
                                        |
                                        {{ foo1 }}
                                    </p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body ">
                                {% for foo1 in x_str %}
                                    <p>
                                        {{ forloop.revcounter0 }}
                                        |
                                        {{ foo1 }}
                                    </p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body ">
                                {% for foo1 in x_str %}
                                    <p>
                                        {{ forloop.first }}
                                        |
                                        {{ foo1 }}
                                    </p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body ">
                                {% for foo1 in x_str %}
                                    <p>
                                        {{ forloop.last }}
                                        |
                                        {{ foo1 }}
                                    </p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>


                </div>
            </div>
        </div>
    </div>

结论:

  • 这里的forloop相当于给可迭代对象的元素添加索引,元素缺失后,不影响索引的显示,还是原来的

for ... empty

for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

# views.py

def test(request):
    x_str1 = 'ABCDE'
    x_str2 = ''

    return render(request, 'test.html', locals())
# test.html

<div class="row">
        <div class="col-md-7 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading text-center"><h1>empty</h1></div>
                <div class="panel-body text-center">

                    <div class="col-md-6">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body">
                                {% for foo1 in x_str1 %}
                                    <p>{{ foo1 }}</p>
                                {% empty %}
                                    <p>暂无内容</p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-6">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_str</p></div>
                            <div class="panel-body">
                                {% for foo1 in x_str2 %}
                                    <p>{{ foo1 }}</p>
                                {% empty %}
                                    <p>暂无内容</p>
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                </div>
            </div>
        </div>
    </div>

结论:

  • empty可以搭配其他的使用
  • 主要用于提示,如果没有元素,就显示暂无内容等信息

if 标签

% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

# views.py

def test(request):
    x_if1 = ''
    x_if2 = 'Hello'
    x_if3 = 0
    x_if4 = 1
    x_if5 = False
    x_dic = {
        'Alan': 85,
        'Ben': 50,
        'Cindy': 70,
        'Danny': 60,
        'Eddy': 99,
    }

    return render(request, 'test.html', locals())
# test.html

<div class="row">
        <div class="col-md-7 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading text-center"><h1>if</h1></div>
                <div class="panel-body text-center">

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_if1</p></div>
                            <div class="panel-body">
                                {% if x_if1 %}
                                    <p>True</p>
                                {% else %}
                                    <p>False</p>
                                {% endif %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_if2</p></div>
                            <div class="panel-body">
                                {% if x_if2 %}
                                    <p>True</p>
                                {% else %}
                                    <p>False</p>
                                {% endif %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_if3</p></div>
                            <div class="panel-body">
                                {% if x_if3 %}
                                    <p>True</p>
                                {% else %}
                                    <p>False</p>
                                {% endif %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_if4</p></div>
                            <div class="panel-body">
                                {% if x_if4 %}
                                    <p>True</p>
                                {% else %}
                                    <p>False</p>
                                {% endif %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_if5</p></div>
                            <div class="panel-body">
                                {% if x_if5 %}
                                    <p>True</p>
                                {% else %}
                                    <p>False</p>
                                {% endif %}
                            </div>
                        </div>
                    </div>

                    <div class="col-md-2">
                        <div class="panel panel-default">
                            <div class="panel-heading text-center"><p>x_dic</p></div>
                            <div class="panel-body">
                                {% for k,v in x_dic.items %}
                                    {% if v >= 90 %}
                                        <p>{{ k }}:优秀</p>
                                    {% elif v >= 80 %}
                                        <p>{{ k }}:良好</p>
                                    {% elif v >= 60 %}
                                        <p>{{ k }}:及格</p>
                                    {% else %}
                                        <p>{{ k }}:不及格</p>
                                    {% endif %}
                                {% endfor %}
                            </div>
                        </div>
                    </div>

                </div>
            </div>
        </div>
    </div>

结论:

  • 只要是:有值或者为True,就可以被识别为True
  • 只要是:没有值(空列表、空集合、空字典)、为False,为0,就会被是被为False
  • 字典取出keyvalue需要在循环中加入.items
  • if语句支持 and or==><!=<=>=innot inisis not判断。

with

使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

# views.py

def test(request):
    class X_Info(object):
        def __init__(self, name):
            self.name = name

        def print_name(self):
            return self.name

        def __str__(self):
            return self.name

    x_obj_d = X_Info('Darker')

    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>with</h1></div>
    <div class="panel-body text-center">
        {% with x_obj_d.print_name as n1 %}
        {{ n1 }}
        {% endwith %}
    </div>
</div>

结论:

  • 相当于起了一个别名,但是 原来的名称还是可以用的
  • 别名也要用{{ }}包裹起来才能用

csrf_token

{% csrf_token%} - 这个标签用于跨站请求伪造保护

# views.py

def test(request):
    return render(request, 'test.html', locals())
# test.html

<div class="panel panel-default">
    <div class="panel-heading text-center"><h1>csrf_token</h1></div>
    <div class="panel-body text-center">
        {% csrf_token %}
    </div>
</div>

结论:

  • 用于跨站请求伪造保护,防止XSS攻击
  • 这里的标签是看不见的,被隐藏的,但是还是在的

七:自定义过滤器、标签、inclusion_tag

自定义过滤器

1.在settings.pyINSTALLED_APPS中注册当前app

2.在当前app下 创建一个template包(有__init__.py_

3.在template包下创建my_tag.py

4.编写代码

from django import template
register = template.Library()
@register.filter
def my_upper(value):
	return value.upper()

5.先load,再使用

{% load my_tags %}
{{ 'aa'|my_upper }}

自定义标签

1.在settings.pyINSTALLED_APPS中注册当前app

2.在当前app下 创建一个template包(有__init__.py_

3.在template包下创建my_tag.py

4.编写代码

from django import template
register = template.Library()
@register.simple_tag
def my_csrf():
    import uuid
    res=uuid.uuid4()
    return mark_safe('<input type="hidden" name="csrfmiddlewaretoken" value="%s">'%res)

5.先load,再使用

{% load my_tags %}
{% my_csrf %}
{% my_tag 1 3 4 %}  

自定义inclusion_tag

1.在settings.pyINSTALLED_APPS中注册当前app

2.在当前app下 创建一个template包(有__init__.py_

3.在template包下创建my_tag.py

4.编写代码

# inclusion_tag,传一个模板文件
@register.inclusion_tag('left.html')
def left(num):
    # dic={0:第0页,1:第1页,2:第2页}
    dic = {i: '第%s页' % i for i in range(num)}
    
    # 固定返回的必须是字典
    print(dic)
    return {'data': dic}

@register.inclusion_tag('beautiful.html')
def beautiful(title, url):
	return {'title': title, 'url': url}

5.先load,再使用

{% load my_tags %}
{% left 5%}
{% beautiful '名字' '地址'%}

八:静态文件的使用

方式1

<link rel="stylesheet" href="/static/css/x.css">

方式2

{% load static %}
<link rel="stylesheet" href="{% static 'css/x.css' %}">

方式3

{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}css/x.css">

特殊用法

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

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

九:模板的导入和继承

模板的导入

1.创建一个模板(例:my_head.html

# my_head.html


2.在要使用的地方,导入该模板

# index.html


模板的继承

1.创建一个母版,当做一个盒子

# base.html

{% block top %}
	...     
{% endblock %}


{% block body %}
	...     
{% endblock %}


{% block footer %}
	...     
{% endblock %}

2.要继承的模板中,写入代码

# guide.html

{% extends 'base.html' %}
{% block top %}
	index页面
{% endblock %}
posted @ 2020-10-20 10:03  轻描丨淡写  阅读(163)  评论(0编辑  收藏  举报