Django4:设计模式及模板层

一、MVC和MTV

1、MVC

MVC代表model、view、controler(模型、视图、控制器)模式。作用:降低模块间的耦合度(解耦)。

  • M:对数据库层的封装
  • V:向用户展示结果(what、how)
  • C:处理请求、获取数据、返回数据

Django4:设计模式及模板层

2、MTV

MTV代表model、template、view(模型、模板、视图)模式。作用:降低模块间的耦合度(解耦)。

  • M模型层(Model):负责数据库交互
  • T模板层(Template):负责呈现内容到浏览器(how)
  • V视图层(View):核心,负责接收请求、获取数据、返回数据(what)

Django4:设计模式及模板层

二、模板层

模板是可根据字典数据动态变化的html网页。模板可根据视图中传递的字典数据动态生成相应的动态html网页。

1、模板配置

(1)创建模板文件夹

路径:

(2)在settings.py中TEMPLATE配置项

  • BACKEND:模板引擎
  • DIRS:模板的搜索目录(一或多个)
  • APP_DIRS:是否要在应用中的template文件夹中搜索模板文件
  • OPTIONS:有关模板的选项

配置项需修改的部分为DIRS,设置DIRS:

'DIRS':[os.path.join(BASE_DIR.’templates’)],

注:

(a)BASE_DIR:当前项目的绝对路径。

(b)Django2中有import os,Django3中from pathlib import Path,故在Django3中解决os找不到的方法:

方法一:import os

方法二(建议):’DIRS’: [Path(BASE_DIR, ‘templates’)]

Django4:设计模式及模板层

2、模板的加载方式

方法一:通过loader获取模板,通过HttpResponse进行响应。

视图函数中:

from django.temple import loader
1.通过loader加载模板
t = loader.get_temple("模板文件名")
2.将t转换成html字符串
html = t.render(字典数据)
3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)

例:

(1)views.py

def test_html(request):
    from django.template import loader
    t = loader.get_template('test_html.html')
    html = t.render()
    return HttpResponse(html)

(2)创建html

在template文件夹中创建html文件test_html.html


    Title

    我是一个模板层

(3)urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_html', views.test_html)
]

(4)启动

python manage.py runserver

Django4:设计模式及模板层

方法二:使用render()直接加载并响应模板

在视图函数中:

from django.shortcuts import render
return render(request, '模板文件名', 字典数据)

例:修改上例中的views.py为如下:

def test_html(request):
    from django.shortcuts import render
    return render(request, 'test_html.html')

3、视图层与模板层之间的交互

(1)视图函数中可将python变量封装到字典中传递到模板

例:views.py

def test_html(request):
    from django.shortcuts import render
    dic = {'username':'king_weng', 'age':18}
    return render(request, 'test_html.html', dic)

(2)模板中,可使用{{ 变量名 }}的语法调用视图传进来的变量


    Title

        {{ username }}我是一个模板层

(3)启动

python manage.py runserver

Django4:设计模式及模板层

三、模板层变量

1、能传到模板中的数据类型

str(字符串)、int(整型)、list(列表)、tuple(元祖)、dict(字典)、func(函数)、obj(类实例化对象)

2、模板中使用变量语法

{{ 变量名 }}
{{ 变量名.index }}
{{ 变量名,key }}
{{ 对象.方法 }}
{{ 函数名 }}

例:

(i)views.py

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

def hello():
    return 'hello world!'

class Dog:
    def say(self):
        return 'wangwang'

def test_html_param(request):
    dic = {}
    dic['int'] = 666
    dic['str'] = 'king_weng'
    dic['list'] = ['aa', 'bb', 'cc']
    dic['dict'] = {'a':11, 'b':22}
    dic['func'] = hello
    dic['class_obj'] = Dog()

    return render(request, 'test_html_param.html', dic)

(ii)template/test_html_param.html


    Title

    int 是 {{ int }}
    str 是 {{ str }}
    list 是 {{ list }}
    dict 是 {{ dict }}
    dict['a'] 是 {{ dict.a }}
    function 是 {{ func }}
    class_obj 是 {{ class_obj.say }}

(iii)urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path("test_html_param", views.test_html_param)
]

输出:

Django4:设计模式及模板层

四、模板层标签

1、作用

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

标签语法:

{% 标签 %}
...

{% 结束标签 %}
(1)if标签
{% if  条件表达式1 %}
...

{% efif  条件表达式1 %}
...

{% else %}
...

{% if  endif  %}

注:if标记中使用括号是无效语法。如需指示优先级,则应用嵌套的if标记。

例:

(i)views.py

def test_if_for(request):
    dic = {}
    dic['x'] = 0
    return render(request, 'test_if_for.html', dic)

(ii)test_if_for.html


    测试if和for

    {% if x > 10 %}
        x大于10
    {%else%}
        x不大于10
    {%endif%}

(iii)urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_if_for', views.test_if_for)
]

输出:

Django4:设计模式及模板层

(2)for标签

语法

{% for 变量 in 可迭代对象 %}
…
{% empty %}
…可迭代对象无数据时填充的语句
{%endfor%}

内置变量forloop:

Django4:设计模式及模板层

五、模板层

模板层过滤器在变量输出时对变量的值进行处理。作用:可通过使用过滤器来改变变量的输出显示。

1、语法:

{{变量|过滤器1:’参数值1’|过滤器2:’参数值2’|…}}

例:{{ int| add:’10’}}

2、常用过滤器

Django4:设计模式及模板层

六、模板层继承

模板继承可使父模板的内容重用,子模板直接继承父模板的全部内容并可覆盖父模板中相应的块;

语法:父模板中:

定义模板中的块block标签

标识出哪些在子模块中是允许修改的

block标签:在父模板中定义,可在子模板中覆盖

语法:子模板中:

继承模板extends标签(写在模板文件中的第一行)

例:{% extends ‘base.html’%}

子模板重写父模板中的内容块

{% block block_name %}

子模板块用来覆盖父模板中block_name块的内容

{% endblock block_name %}

注:重写覆盖规则

  • 不重写,将安装父模板的效果显示
  • 重写,则按重写效果显示
  • 模板继承时,服务器端的动态内容无法继承

例:

(i)views.py

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

def test_html(request):
    return render(request, 'test_html.html')

def base_view(request):
    return render(request, 'base_view.html')

def music_view(request):
    return render(request, 'music_view.html')

def sport_view(request):
    return render(request, 'sport_view.html')

(ii)

base_view.html:


    {% block mytitle %}
    主页
    {% endblock %}

    音乐频道
    体育频道

    {% block info %}
    {% endblock %}

    king_weng版权所有

music_view.html

{% extends 'base_view.html' %}

{% block mytitle %}
  音乐频道
{% endblock %}

{% block info %}
  欢迎来到音乐频道
{% endblock %}

sport_view.html

{% extends 'base_view.html' %}

{% block mytitle %}
  体育频道
{% endblock %}

{% block info %}
  欢迎来到体育频道
{% endblock %}

(iii)urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test_html', views.test_html),
    path('base_index', views.base_view),
    path('music_index', views.music_view),
    path('sport_index', views.sport_view)
]

输出:

Django4:设计模式及模板层

Original: https://blog.csdn.net/King_weng/article/details/124068767
Author: king_weng
Title: Django4:设计模式及模板层

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/735250/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球