Django MTV模式介绍,MTV与MVC的区别,Django模板使用方式,模板继承思路讲解,高效编程

目录

 

1.MTV设计模式

2.与java MVC模式的区别

3.细谈模板 Template

什么是模板

模板的配置

模板的继承

模板继承实例

模板继承用法总结


1.MTV设计模式

MTV为Model-Template-View(模型-模板-视图)模式,很好的诠释了分层开发模式,使开发团队解耦,可独立的开发属于自己一层的程序

作用:降低模块间耦合度,开发解耦,维护解耦。

各层详细说明:

Model:负责与数据库交互,这一类文件用于处理数据库字段对python对象的映射关系,并做一层封装,通常一个文件映射数据库中的一个表单。

Template:负责呈现内容到浏览器,一般为.html文件,该层通常用于显示Model文件的数据,并且让他更加可视化。

View:负责接收请求,相当于处理中枢,获取数据(来自用户) ,经过处理后选择合适的结果返回给用户。View层用于将Model层和Template层的文件封装,举例来说,当用于需要请求一个表单数据,View先通过Model文件拿到这份表单数据,但是这个数据需要有一个好看的格式输出,于是调用Template层,在该层中有一个文件将Model的数据做一个显示的处理,让他的视觉效果更好,做完这两件事后,View层将返回一个结果,用户就可以在网页上看到自己的请求内容了。

流程如图所示:

 

 

2.与java MVC模式的区别

MVC模式为 Model-View-Controller(模型-视图-控制器)

MVC与MVT的目的是一样的,即解耦各层关系,独立开发。

MVC和MTV要达到的目前是一样的,只是各层的叫法不一样,如果了解MVC模式,掌握MTV非常简单,MVC的各层如下:

Model模型层:对数据库层封装

View视图层:相当于MTV的Template模型层,显示内容

Controller控制层:处理请求,返回结果。相当于MTV的视图层

 

 

3.细谈模板 Template

什么是模板

模块是动态变化的html网页,在模板中定义好数据键,将Model拿到的的数据按照数据键的键名一一对应填入,如在模板中定义name=?,age=?,通过model拿到数据libai,40,于是我们看到的结果为name=libai,age=40。

简言之,模板可以根据传递的数据动态生成响应的HTML页面。

模板的配置

在项目目录下创建名为templates的文件夹(实际可以自定义,规划化最好命名为此),该文件通常与项目同级。

在setting.py文件中找到TEMPLATES这一变量

BACKEND:指定模板的引擎

DIRS:模板搜索的目录(可多个) 

APP_DIRS:是否要在应用的templates文件夹中搜索模板文件(通常为TRUE)

OPTIONS:有关模板的选项(初学可忽略,采用默认值)

模板的继承

模板继承可使父模板的内容重复利用,子模板也可以覆盖父模块的内容。

模板继承的应用场景非常多,举个简单的例子,如体育网站,在体育网站中,由于有非常多的体育项目,如果为每一个体育项目开发一个网页将耗费非常多的精力,我们不妨创建一个父模板,即定义整个页面风格张什么样,然后再对模板的部分地方进行改造,以此大幅度的缩短开发时间。

下面具个例子看看模板继承如何使用

模板继承实例

1) 创建一个项目

$ django-admin startproject test1

2)创建templates文件夹

在test1,即项目同级目录下创建templates,并创建base.html,page1.html,page2.html文件

$ mkdir templates
$ cd templates
$ touch base.html page1.html page2.html

 若完成创建,可以得到如下的项目结构

│  db.sqlite3
│  manage.py
│
├─templates
│      base.html
│      page1.html
│      page2.html
│
└─test1
    │  asgi.py
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py
    │
    └─__pycache__
            settings.cpython-36.pyc
            urls.cpython-36.pyc
            views.cpython-36.pyc
            wsgi.cpython-36.pyc
            __init__.cpython-36.pyc

改写base.html,即父模板,文章下面会讲解{% block Content1 %}的含义,现在请跟随案例操作

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

    <style>

    .div1,.div2{ width:300px; height:60px; margin-top:5px}

    .div1{ border:2px solid #F00}

    .div2{ border:4px dashed #F00}

    </style>

</head>
<body>
    这里是父模板
    <div class="div1">
    {% block Content1 %}
    区域1
    {% endblock Content1 %}
    </div>
    <div class="div2">
       {% block Content2 %}
    区域2
    {% endblock Content2 %}
    </div>

</body>
</html>

 3)修改setting.py文件

找到TEMPLATE这一变量,修改成如下。这一步是为了让程序找到我们创建的templates文件夹

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

4)创建views.py

创建视图文件,用于处理请求。render函数用于调用模板文件,该函数会在项目下进行检索,找到同名文件。

render格式

render(request,"模板名",参数组(通常为字典))

#如

render(request,"base.html",{'name':'libai','age':'40'})

from django.http import HttpResponse
from django.template import loader
from django.shortcuts import render



def base index_view(request):
    return render(request,"base.html")

def page1_view(request):
    return render(request,"page1.html")

def page2_view(request):
    return render(request,"page2.html")

 5)定义路由规则

路由规则用于处理用户请求文件与本地函数的调用关系,用户请求base.html,则交给views文件下的base_view函数处理,注意要调入视图文件。

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('base.html',views.base_view),
    path('page1.html',views.page1_view),
    path('page2.html',views.page2_view),

]

6) 启动项目

$ python manage.py runserver 127.0.0.1:8000

打开浏览器输入:http://127.0.0.1:8000/base.html

结果如下

 到这一步我们没有体现模板继承的概念,下面的操作将展示模板继承是如何发挥作用的

7)模板继承

改写page1.html,如下

{% extends 'base.html' %}

{% block Content1 %}
这里是page1,改写了区域1
{% endblock Content1 %}

{% block Content2 %}
这里是page1,改写了区域2
{% endblock Content2 %}r

改写page2.html 

{% extends 'base.html' %}

{% block Content1 %}
这里是page2,改写了区域1
{% endblock Content1 %}

{% block Content2 %}
这里是page2,改写了区域2
{% endblock Content2 %}r

 在浏览器输入:http://127.0.0.1:8000/page1.html

http://127.0.0.1:8000/page2.html

如下所示,我们可以看到效果了,通过{% extends 'base.html' %}继承父模板的所有内容,通过{% block Content1 %}改写区域内容

模板继承用法总结

子模板通过extends标签继承父模板

注意:需写在第一行

{% extends '父模板名' %}

定义父模板的block标签

标识出那些内容可以被子模板修改

格式如下

{% block block_name %}
内容
{% endblock block_name %}

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值