Django 的设计模式及模板层

一、MVC 和 MTV

1、MVC(传统)

  • Model-View-Controller(模型-视图-控制器)模式;【M】-主要用于对数据库层的封装;【V】-用于向用户展示结果(What+How);【C】-用于处理请求、获取数据、返回结果(重要
  • 作用:降低模块间的耦合度(解耦

2、MTV(Django)

  • Model-Template-View(模型-模板-视图)模式;【M】-负责与数据库交互;【T】-负责呈现内容到浏览器(How);【V】-是核心,负责接收请求、获取数据、返回结果(What

3、T(模板层)

  • 模板是可以根据字典数据动态变化的 html 网页
  • 模板可以根据视图中传递的字典数据动态生成相应的 HTML 网页
3.1、模板配置
  • 创建模板文件夹:<项目名>/templates

  • settings.pyTEMPLATES 配置项

    • BACKEND:指定模板的引擎
    • DIRS:模板的搜索目录(可以是一个或者多个)
    • APP_DIRS:是否要在应用中的 templates` 文件夹中搜索模板文件
    • OPTIONS:有关模板的选项
    • 配置项中需要修改的部分:设置 DIRS - 'DIRS':[os.path.join(BASE_DIR, 'templates)]
  • 模板的加载方式

    • 方案1:通过 loader 获取模板,通过 HttpREsponse 进行响应
    • 方案2:使用 render() 直接加载并响应模板
  • 视图层与模板层之间的交互:

    • 视图函数中可以将 `Python 变量封装到 字典 中传递到模板
    • 模板中,我们可以用 {{变量名}} 的语法,调用视图传进来的变量
3.2、变量与标签
  • a、变量

    • 视图函数中可以将 Python 变量封装到字典中传递到模板上:str - 字符串;int - 整型;list - 数组; tuple - 元组; dict- 字典;func - 方法;obj` - 类实例化的对象
    • 模板替换类似于 python 模块 template,类似的规则
  • b、标签

    • 将一些服务器端的功能嵌入到模板中,例如流程控制等

    • 标签语法:{% 标签 %} … {% 结束标签 %}

    • if 标签:

      • if 条件表达式里可以用的运算符:==!=<>>=<=innot inisis notnotandor
      • if 标记中使用实际括号是无效的语法,如果需要它们指示优先级,则应使用嵌套的 if 标记。
    • for 标签:

      • 语法:{% for 变量 in 可迭代对象 %} … 循环语句 {% empty %} …` 可迭代对象无数据时填充的语句 `{% endfor %}
      • 内置变量:forloop
3.3、过滤器和继承
  • 过滤器

    • 定义:在变量输出时对变量的值进行处理
    • 作用:可以通过使用 过滤器 来改变变量的输出显示
    • 语法:{{ 变量 | 过滤器1:‘参数值1’| 过滤器2:‘参数值2’…}} (可以在 模板文件 输出参数的地方添加 | 进行添加过滤)
    • 官方文档:
    • 常用过滤器:
      • lower - 将字符串转换为全部小写
      • upper - 将字符串转换为全部大写
      • safe - 默认不对变量内的字符串进行 html 转义
      • add:"n" - 将 value 的值增加 n
      • truncatechars:"n" - 若字符串字符多于指定的字符数量,那么会被截断,截断的字符串将以可翻译的省略号序列(‘’)结尾。
  • 继承

    • 定义:模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块
    • 语法:
      • 父模板中:定义父模板中的块 block 标签;标识出哪些在子模版中是允许被修改的;block 标签:在父模板中定义,可以在子模板中覆盖
      • 子模板中:继承模板 extends 标签(写在模板文件的第一行),例如 {% extends 'base.html' %}
        • 子模板 重写父模板中的内容块;{% block block_name %}` 子模板块用来覆盖父模板中 `block_name` 块中的内容 `{% endblock block_name %}