django框架之模板系统

MVC框架

  MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

MTV框架:

  Model(模型):负责业务对象与数据库的对象(ORM)

       Template(模版):负责如何把页面展示给用户

       View(视图):负责业务逻辑,并在适当的时候调用Model和Template

Django模板中只需要记两种特殊符号:

{{  }}和 {% %}

{{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作

{{ 变量名 }}

变量名由字母数字和下划线组成。

点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

举例:

view中的代码:

def test(request):
    name = 'alex'
    age = 83
    name_list = ['和尚','阿三','阿瑟东','独家']

    return render(request,'test.html',{
        'name':name,
        'age':age,
        'name_list':name_list,
    })

模板中的代码:

<p>{{ name }}</p>
<p>{{ age }}</p>
<p>{{ name_list }}</p>
<ul>
    {% for name in name_list %}
        <li>{{ name }}</li>
    {% endfor %}
</ul>
<hr>
{{ name_list.0 }}
{{ name_list.1 }}
{{ name_list.2 }}
{{ name_list.3 }}

列表中的名字可以通过for循环取出,也可以用 . 索引 取出。

字典中的名字是通过  . key  取出 ,也可以通过for循环取

例子:

views中的代码:

 name_dict = {
        'name1': '和尚',
        'name2': '和尚贼秃',
        'name3': '杜标',
        'name4': '杜菊飞',
    }

模板html的代码:

{{ name_dic }}
{{ name_dic.name1 }}
{{ name_dic.name2 }}
{{ name_dic.name3 }}

{% for i in name_dic.values %}
{{ i }}
{% endfor %}

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

也可以将类渲染到模板中,类的取值可以通过调用 类.属性名或方法名 来获取值。例子:

views中的代码:

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return '<Person object: {}>'.format(self.name)
    def dream(self):
        return '{}我想带你去浪漫的西二旗,然后一起去上地做面试题,其实我比较喜欢望京西'.format(self.name)
  def __repr__(self):
return '<Person object: {}>'.format(self.name)

  
def test(request): p1 = Person('alex',22) p2 = Person('qwer',25) return render(request,'test.html',{ 'p1':p1, 'p2':p2,
     P_list = [p1,p2]  })

模板中的代码:

{{ p1 }}
{{ p1.name }}
{{ p1.age }}
{{ p1.dream }}
<br>
{{ p2 }}

这里插入一个小知识:

class中 __init__方法和__repr__方法的区别:

   如果是直接调用类中的属性或方法,则用的是__init__方法,如果是程序调用类中的属性或方法,就用的是__repr__方法,上述代码中,如果将p1,p2放在列表中,通过P_list列表调用类的属性或方法,就调用的是__repr__方法。在python2中__repr__的方法叫做__unicode__。

Filters:

翻译为过滤器,用来修改变量的显示结果。

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

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

default

{{ value|default:"nothing"}}
注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用
例子:
{{ qwer|default:'没有传这个值,使用默认值' }}

filesizeformat

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

views代码:

file_size1 = 1024
file_size2 = 1024*1024

模板中的代码:

{{ file_size1|filesizeformat }}
{{ file_size2|filesizeformat }}

add

给变量加参数  可是以实现数字加法,字符串拼接,列表的拼接

{{ value|add:"2" }}

value是数字4,则输出结果为6。

{{ first|add:second }}

如果first是 [1,.2,3] ,second是 [4,5,6] ,那输出结果是 [1,2,3,4,5,6] 。

lower

小写

{{ value|lower }}

upper

大写

{{ value|upper}}

title

标题

{{ value|title }}

ljust

左对齐

"{{ value|ljust:"10" }}"

rjust

右对齐

"{{ value|rjust:"10" }}"

center

居中

"{{ value|center:"15" }}"

length

{{ value|length }}

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

slice  

切片

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

first

取第一个元素

{{ value|first }}

last

取最后一个元素

{{ value|last }}

join

使用字符窜拼接列表。同python的str.join(list)。 可以将列表拼接成字符串

{{ value|join:" // " }}

truncatechars

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

参数:截断的字符数

{{ value|truncatechars:9}}

date

日期格式化

view中的代码:

import datetime
    date_now = datetime.datetime.now()
  date_day = datetime.date()
print('1111111', date_now)

模板中的代码:

{{ date_now|date:'Y-m-d H:i:s' }}<br>
{{ date_now}}
{{ date_day}}

如果不想再模板后面加参数可以现在setting中进行设置,

safe

views代码:

value = "<a href='#'>点我</a>"

模板中的代码:

{{ value|safe }}
{{ value }}

自定义filter:

自定义过滤器只是带有一个或两个参数的Python函数:

  • 变量(输入)的值 - -不一定是一个字符串
  • 参数的值 - 这可以有一个默认值,或完全省略

例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”

  在app01下面新建一个package,名字必须为templatags,然后再这个文件夹下新建一个py文件,然后就在这个py文件里写自己的filter过滤器。

from django import template
register = template.library()

@register.filter   #如果后面有name参数:@register.filter(name='sb'),
            #就相当于给add_sb的过滤器起了个别名,那么在模板中使用的时候,就要用sb这个别名。

def add_sb(value,arg): return '{}_{}_sb'.format(value,arg)

然后再模板中,先导入自己定义的myfilters文件,然后取值:

{%load myfilters%}
{{name_list.0|add_sb:'就是'}}   #@register.filter(name='sb')使用name参数后,就应该写成
                  #{{name_list.0|sb:'就是'}}


#如果给arg赋上值,模板中就不需要写参数了
{{name_list.1|add_sb}}

原文地址:https://www.cnblogs.com/yb635238477/p/9392544.html