Baobao$

博客园 首页 新随笔 联系 订阅 管理

MVC框架和MTV框架

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

Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

Django的MTV模式

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

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

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

        此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,           view再调用相应的Model和Template

Django框架图示

 

Django模板系统

模板用法之变量 (.) 的用法

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

{{ }} 和 {% %}

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

变量

{{ 变量名 }}

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

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

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^template_test/',views.template_test),
[
View Code

view中代码

from django.shortcuts import  render

class Person:           #定义一个类
            def __init__(self,name,age):
                     self.name=name
                     self.age=age
            def eat (self):
                    return '正在吃草'
            def __str__(self):
                   return '<Person : {} - {} >'.format(self.name,self.age)

def  template_test (request):    #定义一个函数
              string='张张'
              age=83
              sex_direction=['小小' , '大大']   #取向
        dic={'name' : "张张" ,"pwd" : 'zz'}

            p1=Person('小小',17)

           return render(request,"template_test.html" ,
                                    {
                                        " string" : string,
                                        "age" : age,
                                         "sex_direction" : sex_direction ,
                                         "dic" : dic ,
                                         'p1' : p1
                                    })
View Code

模板中支持的写法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
      {{string}} 
     <br>
      {{age}}
     <br>               
      {{sex_direction.0}} {{sex_direction.1}}  #.索引就能拿到对应的值
     <br>
      {{dic}}   {{dic.name}}    {{dic.pwd}}
     <br>
      {{dic.keys}}
     <br>
      {{dic.values}}
     <br>
      {{dic.items}}
     <br>
      {{p1}}    {{p1.name}}     {{p1.age}}   {{p1.eat}}
</body>
</html>
View Code

注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

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

模板语法之过滤器 Filters   

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

语法: {{ value|filter_name:参数 }}  #参数最多一个

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

default

{{ value|default:"nothing"}}

如果value值没传的话就显示nothing

注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。

filesizeformat

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

{{ value|filesizeformat }}

例子:

views.py中:

def  template_test (request):    
           return render(request,"template_test.html" ,
                                    {
            'filesize' : 1                        # 1 bytes                                        
               'filesize' : 1*1024               #1.0KB
                                           'filesize' : 1*1024 *1024     #1.0MB
                                    }
View Code

模板中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

     {{filesize|filesizeformat}}

</body>
</html>
View Code

如果 value 是 123456789,输出将会是 117.7 MB。

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

{{ value|join:" // " }}   使用字符串拼接列表。同python的str.join(list)。

truncatechars

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

参数:截断的字符数

{{ value|truncatechars:9}}

date

{{ value|date:"Y-m-d H:i:s"}}     日期格式化

 views.py:

from django.shortcuts import render
import dateime


def  template_test (request):   
        
            now = datetime.datetime.now()
    
           return render(request,"template_test.html" ,
                                    {
                      
                                    'now' : now,
                                    })        
View Code

 模板中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

时间:{{now}}
 </body>
</html>
View Code

 在setts.py中做好位置直接{{now}}就可以了

 

safe

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

 

Tags 标签

for

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用的一些参数:

Variable                                                             Description

forloop.counter                                      当前循环的索引值(从1开始)

forloop.counter0                                    当前循环的索引值(从0开始)

forloop.revcounter                                 当前循环的倒序索引值(从1开始)     

forloop.revcounter0                                当前循环的倒序索引值(从0开始)         

forloop.first                                            当前循环是不是第一次循环(布尔值)

forloop.last                                            当前循环是不是最后一次循环(布尔值)

forloop.parentloop                                  本层循环的外层循环
View Code

for ... empty

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

if,elif和else

{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

当然也可以只有if和else 

{% if user_list|length > 5 %}
  七座豪华SUV
{% else %}
    黄包车
{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with

定义一个中间变量  

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

跨站请求伪造和csrf_token

csrf_token

这个标签用于跨站请求伪造保护。

在页面的form表单里面写上{% csrf_token %}

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^form/', views.form),
    ]
View Code

views.py

def  form(request):
       {% csrf_token %}
       return render(request, 'form.html ')
View Code

模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form  action=' '  method='post' >
        <button>提交<button>
</body>
</html>
View Code

在在页面的form表单里面写上{% csrf_token %} 就可以提交post 请求了

母板和继承即组件

母版

注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

继承母版

在子页面中在页面最上方使用下面的语法来继承母板。

{% extends 'layouts.html' %}

块(block)

通过在母板中使用{% block  xxx %}来定义"块"。

在子页面中通过定义母板中的block名来对应替换母板中相应的内容。

组件

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

{% include 'navbar.html' %}

 静态文件相关

 

posted on 2019-01-22 19:20  Baobao$  阅读(168)  评论(0编辑  收藏  举报