web框架设计模式
- MVC
- MTV
MVC
经典的MVC模式中:
- M(model)业务模型,代表一个存储数据的对象
- V(view)用户界面,代表模型数据的可视化
- C(controller)控制器,作用于模型和视图上。它控制数据流向,并在数据变化时更新视图。它使视图与模式解耦。
MTV
django的设计模式称为MTV,本质上跟MVC一样,只是叫法不同
- M(Model)模型,与MVC中的M功能相同,负责和数据库交互,进行数据处理
- V(VIew),视图,与MVC中的C功能相同,接收请求,进行业务处理,返回响应
- T(Template),模板,与MVC中的V功能相同,负责构造要返回的html页面
django中数据流和请求流程如下:
1、用户通过浏览器发起请求
2、view根据请求和业务逻辑向model获取或者发送数据
3、model根据视图的要求和数据库进行交互
4、view收到model返回的结果后,将结果发送给template
5、template将收到的数据渲染成最终的html返回给view
6、view将最终包含结果数据的html返回给用户
模板
直接返回一个html页面,确定,内容多时很不方便
def index(request):
return HttpResponse("<h1 style='color:red'>这个是首页面</h1>")
创建templates
1、在crm应用同级目录,创建一个templates目录,在templates目录下创建crm(应用名)目录,然后在crm目录下创建模板文件index.html
2、在index.html中的body中添加一行代码
<body>
<h1 style="color: green">{content}</h1>
</body>
此处预留的content,后续用来传参。
此处的{}可能会和js的{}冲突,所以可以使用{{}}
3、导入项目BASE_DIR
from django.conf import settings
def index(request):
content = '这是首页面123'
with open(settings.BASE_DIR / 'templates/crm/index.html', 'r', encoding='utf-8') as f:
template = f.read()
template = template.format(content=content)
return HttpResponse(template)
format后面跟的content与index.html中content对应
配置模板路径
django框架找模板的配置
在study_django目录下的settings.py文件中找到TEMPLATES列表中的字典的关键字DIRS设置参数。
'DIRS': [str(BASE_DIR / 'templates')],
pycharm配置
右键点击templates,选择Mark Directory as --> Template Folder
调用templates
方式一:
from django.template.loader import get_template
def index(request):
content = '这是首页面123'
template = get_template('crm/index.html')
html = template.render(context={'content':content})
return HttpResponse(html)
注: context的参数是字典,且字典的key是需要渲染的变量的名称,index.html中变量需要使用{{ content }}
方式二:
from django.shortcuts import render
def index(request):
content = '这是首页面123'
return render(request, 'crm/index.html', context={'content': content})
传字典、列表和函数
index.html
<body>
<h1 style="color: green">{{ content }}</h1>
<p>列表ls = {{ ls }}</p>
<p>ls[0] = {{ ls.0 }}</p>
<p>字典dc = {{ dc }}</p>
<p>字典dc['name'] = {{ dc.name }}</p>
<p>函数fu = {{ fu }}</p>
</body>
view.py
def index(request):
content = '这是首页面12345'
ls = [1, 2, 3]
dc = {'name': 'abc', 'age': 17}
def fu():
return "这是一个函数"
return render(request, 'crm/index.html', context={'content': content, "ls": ls, "dc": dc, "fu": fu})
模板变量的解析规则
1、当模板引擎遇到模板变量时,它会计算该变量,并将其替换为结果
2、当模板引擎在变量中遇到.时(x.y形式),它会按以下顺序尝试查找:
1、字典键值查找
2、属性或方法查找
3、数字索引查找
3、如果结果是可调用的,则调用它时不带参数。调用结果成为模板值
模板标签
只能见到渲染变量,显然不能满足需求,django的模板系统中还提供了模板标签来实现更多的渲染,例如判断和循环
for循环
循环浏览数组中的每个项目,使该项目可以在上下文变量中可用,例如,要显示students_list中提供的学生列表
在student_list.html文件中使用for循环遍历students列表中的值
<table border>
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
</thead>
<tbody>
{% for student in students %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ student.name }}</td>
<td>{{ student.age }}</td>
<td>{{ student.sex }}</td>
</tr>
{% endfor %}
</tbody>
</table>
if
{% if %}标签会判断给定的变量,当变量为True时(比如存在、非空、非布尔值False),就会输出块的内容:
{% if student_list %}
学生的数量:{{ student_list|length }}
{% else %}
没有学生
{% endif %}