一、MVC和MTV
1、MVC
MVC代表model、view、controler(模型、视图、控制器)模式。作用:降低模块间的耦合度(解耦)。
- M:对数据库层的封装
- V:向用户展示结果(what、how)
- C:处理请求、获取数据、返回数据
2、MTV
MTV代表model、template、view(模型、模板、视图)模式。作用:降低模块间的耦合度(解耦)。
- M模型层(Model):负责数据库交互
- T模板层(Template):负责呈现内容到浏览器(how)
- V视图层(View):核心,负责接收请求、获取数据、返回数据(what)
二、模板层
模板是可根据字典数据动态变化的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’)]
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
方法二:使用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
三、模板层变量
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)
]
输出:
四、模板层标签
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)
]
输出:
(2)for标签
语法
{% for 变量 in 可迭代对象 %}
…
{% empty %}
…可迭代对象无数据时填充的语句
{%endfor%}
内置变量forloop:
五、模板层
模板层过滤器在变量输出时对变量的值进行处理。作用:可通过使用过滤器来改变变量的输出显示。
1、语法:
{{变量|过滤器1:’参数值1’|过滤器2:’参数值2’|…}}
例:{{ int| add:’10’}}
2、常用过滤器
六、模板层继承
模板继承可使父模板的内容重用,子模板直接继承父模板的全部内容并可覆盖父模板中相应的块;
语法:父模板中:
定义模板中的块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)
]
输出:
Original: https://blog.csdn.net/King_weng/article/details/124068767
Author: king_weng
Title: Django4:设计模式及模板层
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/735250/
转载文章受原作者版权保护。转载请注明原作者出处!