天天看点

Django框架学习(二)一. MVC框架和MTV框架二. Django模板系统

内容来源于【2020 最新python教程】第五部分:Django框架课程教学笔记和maple-shaw博客笔记

一. MVC框架和MTV框架

该部分内容转载自aaronthon

(一)MVC:

M:model模型,操作数据库;

V:view视图,展示数据;

C:contriller控制器,流程业务逻辑

(二)MTV:

M:model模型,ORM(对象关系管理器);

T:template模板;

V:view视图,业务逻辑

二. Django模板系统

Django模板中的{{***}}和{{%*** %}}符号{{***}}表示变量,在模板渲染的时候替换成对应的值,如从view中传入template的值。{{%*** %}}表示逻辑相关的操作,图在template中的for标签,if标签等。

(一) 变量

变量名由字母数字和下划线组成,不能以数字开头

(二) 模板语法

模板测试用例

#在urls.py文件中加入
path('template_test/', views.template_test),
           
#在views.py 中定义template_test方法
def template_test(request):
    num=1
    string='happy every day'
    name_list=['rongmei','meizi']
    dic={'name':'rongmei','age':24}
    tup=('rongmei','meizi')
    name_set={'rongmei','meizi'}

    class Person:#定义类
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def talk(self):
            return '今天雾霾比较严重'
        def __str__(self):
            return('<Person object {}:{}>'.format(self.name,self.age))
    rongmei=Person('rongmei',24)#实力化对象
    return render(request,'template_test.html',
                  {
                      'num':num,
                      'string':string,
                      'name_list':name_list,
                      'dic':dic,
                      'tup':tup,
                      'name_set':name_set,
                      'rongmei':rongmei
                  })
           
#在模板中渲染
<body>
{{ num }}
<br>
{{ string }}
<br>
{{ name_list.0 }}<!--用‘.’+索引代替python中的[索引]进行索引-->
<br>
{{ dic }}<!--模板中调用方法不需要加'()',如dic.keys,dic.items-->
<br>
{{ tup }}
<br>
{{ name_sey }}
<br>
{{ rongmei.talk }}<!--只能执行不带参数的方法-->
<br>
</body>
           

结果

Django框架学习(二)一. MVC框架和MTV框架二. Django模板系统

注:当模板系统遇到’(.)'时,会按照如下顺序进行查询

  1. 在字典中查询
  2. 属性或者方法
  3. 数字索引

(三)Filters过滤器

过滤器用来修改变量的显示结果

语法:{{变量1|过滤器1:参数},{变量2|过滤器2:参数},{变量2|过滤器3:参数}},参数是可选的,最多一个参数

注:’:'左右没有空格

  1. default过滤器,变量不存在或者为空时使用

    {value|defalut:‘nothing’},如果value变量没有传值的话就显示默认的‘nothing’字符串。

    如在模板文件中写{{变量}},该变量未在views中定义,则在页面中什么都不显示,若使用defalut过滤器{{变量|defalut:‘默认值’}},则在页面中显示默认值。

  2. filesizeformat过滤器将数字转化为一个“人类可读的”文件尺寸,{例如‘13KB’,‘4.1MB’等}

    例如:在views中定义变量’filesize’:1024,在模板中直接渲染{{filesize}}变量,在页面中显示数字1024,在渲染时加filesizeformat过滤器即{{filesize|filesizeformat}},在页面中显示1KB(为文件的大小)

  3. add过滤器,加法或者字符串,列表等拼接的作用

    {{4|add:2}}结果为6

    {{4|add:-2}}结果为2,在参数前面加-号即为减法

    {{‘hello’|add:‘world’}}结果为helloworld。

  4. lower过滤器,小写

    {{value|lower}}

  5. upper过滤器,大写

    {{value|upper}}

  6. title过滤器,标题

    {{value|title}}

  7. ljust过滤器,左对齐

    {{value|ljust}}

  8. rjust过滤器,右对齐

    {{value|rjust}}

  9. length过滤器,返回value的长度

    {{value|length}} 若value为[1,2,3,4],结果为4

  10. slice过滤器,切片

    {{value|slice:'0:2’}}取value值的索引为0和1的元素,引号中的写法和python中的语法一致

  11. first过滤器,取第一个元素,last过滤器取最后一个元素
  12. join过滤器,使用字符拼接列表,通python的str.join(list)

    {{value|join:’’}},将value(list类型)中的元素用‘’连接起来

  13. truncatechars过滤器,如果字符串字符多余指定的字符数量,则被截断,阶段的字符串将以可翻译的省略号“……”结尾,参数为截断的字符数,truncatewords以单词为单位进行截断,或者以空格进行截断。
  14. date过滤器,日期格式化,用的稍微多一点

    {value|date:‘Y-m-d H:i:s’},在python中格式化年月日为%Y-%m-%d,时分秒为%H:%M:%S,与Django中稍有不同,需要注意

import datetine
now=datetime.datetime.now()#获取当前时间
           

或者在settings中将USE_LION改为false,然后将时间的格式设置为DATETIME_FORMAT='Y-m-d H:i:s’也能达到上述效果

DATE_FORMAT=‘Y-m-d H:i:s’#仅date类型

TIME_FORMAT=‘Y-m-d H:i:s’#仅time类型

15. safe过滤器,告诉Django这段代码是安全的,不必进行转义,即不对HTML标签和JS等语法进行自动转义,如:

{value|}

(四)自定义过滤器

  1. 在app下创建一个名为templatetags的python包
  2. 在templatetags中创建一个python文件,文件名可自定义(mytags.py)
  3. 在自定义的文件中导入template模板和写register=template.Library()语句,此步骤为固定写法
from django import template
register=template.Library()#此处的()不能少
           

注:上述步骤中,包的名字templatetags不能错,且register变量名字也不能错

4. 写函数+装饰器

@register.filter#注册过滤器
def add_arg(value,arg):#自定义过滤器最多两个参数,value为过滤器变量
    #功能,字符串拼接
    return "{}_{}".format(value,arg)
           
  1. 加载过滤器和使用自定义过滤器
{% load mytags  %}<!--导入过滤器-->
{{ rongmei.name|add_arg:'tanqi' }}<!--在模板中使用自定义过滤器-->