Django学习笔记(五)
MVC和MTV对比
传统的MVC(Model-View-Controller)
- M 模型层,主要是对数据库层的封装
- V 视图层,向用户展示结果
- C 控制层,用于请求,获取数据和返回结果
Django的MTV
-
M 模型层,负责与数据库的交互
-
T 模板层,负责呈现到浏览器中
-
V 视图层是核心,负责接受请求,获取数据和返回结果
-综上,他们的作用就是降低耦合度CMTV
模板
- 模板是可以根据字典数据动态变化的html网页
- 模板可以根据视图层中传递的字段数据动态生成相应的HTML网页
模板的配置
- 在项目的同级目录下创建文件夹templates
- 在settings.py中TEMPLATES配置项,需要配置’DIRS’: [os.path.join(BASE_DIR,‘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',
],
},
},
]
模板的加载
- 方案一:通过loader获取模板,通过HttpRespons进行响应
注意:需要导入loader模块
# 导入loader模块
from django.template import loader
# 通过loader加载模板
t = loader.get_template('模板文件名')
# 将t转换成HTML字符串
html = t.render(字典数据)
# 使用httpresponse 将html的字符串返回给浏览器
return HttpResponse(html)
- 方案二:通过使用render()直接加载并响应模,这种方法比较常用
-在视图函数中
from django.shortcuts import render
return render(request,'模板名',字典数据)
视图层与模板层之间的交互
- 视图函数中可以将python的变量封装到字典中传递到模板
-样例
def xxx_vier(request)
dic = {
'变量1':'值1',
'变量2':'值2',
}
return rander(request,'xxx.html',dic)
- 在模板中,我们可以使用{{变量名}}的语法,调用视图函数传进来变量
模板层- 变量
模板的变量
- str /int /list/tuple/dict/func/obj(类的实例化变量)
模板的调用方法
-
{{变量名}}
-
获取列表中的某个值:{{变量名.index}}
-
获取字典中的某个值:{{变量名.key}}
-
如果是一个函数,返回他的返回值:{{对象.方法}}
-
{{函数名}}
-练习
def test_html_param(request): dic = {} dic['int'] = 88888888 dic['str'] = 'wangxiaoning' dic['list'] = ['A', 'K', 'Q', 'J'] dic['dict'] = {'a': 9, 'b': 8} dic['fun'] = say_hi dic['class_obj'] = Dog() return render(request, 'test_html_param.html', dic) def say_hi(): return 'Hello' class Dog(): def say(self): return '汪汪汪汪'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>int : {{int}}</h3>
<h3>str : {{str}}</h3>
<h3>list : {{ list }}</h3>
<h3>list[0] : {{ list.0 }}</h3>
<h3>dict['a'] :{{ dict.a }} </h3>
<h3>fun : {{ fun }}</h3>
<h3>class_obj:{{ class_obj.say }}</h3>
</body>
</html>
- 结果
模板-标签
- 作用:将一些服务器的功能嵌入到模板中
- 标签的语法:
{%标签%} .............. {%结束标签%}
- if 标签
{%if 表达式1%}
...........
{%elif 表达式2%}
..........
{%endif%}
if条件表达式是可以用运算符,但是使用括号提高运算优先级在这里行不通了
-
for标签
{% for 变量 in 可迭代对象%} ............循环语句 {%empty%} ...........可迭代对象无数据时填充的语句 {%endfor%}
- 内置变量
- forloop.counter 循环的当前迭代(从1开始)
- forloop.counter0 循环的当前迭代(从0开始)
- forloop.revcounter counter值倒序
- forloop.recounter0 rercounter值倒序
- forloop.first 如果这是第一次通过循环,则为真
- forloop.last 如果这是最后一次循环,则为真
- forloop.parentloop 当嵌套循环,parenloop表示外层循环