Django的设计模式

2022-09-26 15:26:53 浏览数 (1)

传统的MVC

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

  • M(模型层):主要对数据库层的封装
  • V(视图层):用于向用户展示数据
  • C(控制层):用于处理用户请求、获取数据、返回结果(重要)

作用:降低模块之间的耦合性(解耦)

DJango的MTV模式

MTV代表Model-Template-View(模型-模板-视图)模式

  • M(模型层):负责与数据库进行交互
  • T(模板层):负责呈现内容到浏览器
  • V(视图层):核心,负责接受请求、获取数据、返回结果

什么是模板?

  1. 模板是可以根据字典数据动态变化的HTML网页
  2. 模板可以根据视图中传递的字典数据动态生成相应的HTML
代码语言:javascript复制
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates', # 模板引擎
        'DIRS': [BASE_DIR / 'templates'] # 模板的搜索目录,可以是多个
        ,
        'APP_DIRS': True, # 是否要在应用中的template文件夹中搜索模板文件
        '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',
            ],
        },
    },
]

模板的载入方式

  1. 第一种方法
代码语言:javascript复制
from django.template import loader
# 1.通过loader加载模板
t = loader.get_template("模板名称")
# 2.将t转成HTML字符串
html = t.render(字典数据)
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)
  1. 第二种方法
代码语言:javascript复制
from django.shortcuts import  render
return  render(request,'index.html')

视图层与模板层的交互

  1. 视图函数可以将python变量封装到字典中传到模板内部
代码语言:javascript复制
def template_view(request):
    cpu_info = {
        "CPU_Core": psutil.cpu_count,
        "CPU_Used": psutil.cpu_percent
    }
    return  render(request,'index.html',cpu_info) # 需要把cpu_info返回
  1. 模板中可以使用{{变量名}}的语法 调用视图传进来的变量
代码语言:javascript复制
<blockquote class="layui-elem-quote layui-quote-nm">
  处理器信息:{{ CPU_Core }} </p>
  处理器使用率: {{ CPU_Used }}
</blockquote>

模板的变量

可以传到模板中的数据类型

注意以下调用方法不是对应类型的调用方法,只是告诉你有这些调用方法

数据类型

调用方法

int整形

{{变量名}}

list列表

{{变量名.index}}

tuple元祖

{{变量名.key}}

dict字典

{{对象.方法}}

func方法

{{函数名}}

obj实例化对象

只不过是取值的时候会有不同

模板取值

代码语言:javascript复制
def test_request(request):
    dic = {}
    dic['int'] = 100
    dic['str'] = 'Alex'
    dic['list'] = ['Addr','Beijing']
    dic['dict'] = {"name","Alex"}
    dic['func'] = say_hi
    dic['class_obj'] = Dog()
    print(dic)
    return  render(request,'test.html',dic)

def say_hi():
    return "HHHH"


class Dog(object):
    def say(self):
        return  "wang wang wang !"
代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <h1> int是 {{ int }}</h1>>
  <h1> str是 {{ str }}</h1>>
  <h1> list是 {{ list.0 }}</h1>> // 取列表值下标0
  <h1> dict是 {{ dict }}</h1>>
  <h1> function 是 {{ func }}</h1>> 
  <h1> class_obj 是 {{ class_obj.say }}</h1>> # 调用class_obj下的say方法

</head>
<body>

</body>
</html>

0 人点赞