前言
系列文章目录
视频及资料和课件
链接:https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd=1234
提取码:1234
1. 模板的配置
在项目中单独创建一个文件夹templates,用于存放模板。
设置模板的查找路径
'DIRS': [ os.path.join(BASE_DIR, 'template') ], • 1
2. 定义模板
定义模板其实就是定义一个html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> {# name 为模板等待接收的数据,需要View查询数据库传入模板 #} <h1>你好 {{ name }}</h1> </body> </html>
3. 模板的使用
调用模板分为两步骤:
- 找到模板,模板文件在模板目录中的相对路径 -> 返回模板对象
- 渲染模板
渲染模板使用Django提供的函数render()
。
render(request对象, 模板文件路径, 模板数据字典)
from django.shortcuts import render from django.http import HttpRequest from django.http import HttpResponse from django.http import JsonResponse from django.shortcuts import redirect from django.urls import reverse import json from django.views import View # Create your views here. # 使用类视图 class LoginView(View): # get用于处理页面资源的获取 def get(self, request): # 假设姓名数据为 张三 name = '张三' # 组织传递给模板的数据 # 将数据传递给模板,需要使用字典进行传递 context = { 'name': name } # render第一个参数为请求对象,第二个参数为模板路径,第三个参数为数据字典 # 对模板进行渲染,并返回渲染后的页面 return render(request, 'index.html', context) def post(self, request): return HttpResponse('post')
路由配置:
urlpatterns = [ path('admin/', admin.site.urls), path('login/', include(('login.urls', 'login'), namespace='login')), path('book/', include(('book.urls', 'book'), namespace='book')) ]
from django.urls import path from login import views urlpatterns = [ path('', views.login), path('set_cookie/', views.set_cookie), path('get_cookie/', views.get_cookie), path('del_cookie/', views.del_cookie), path('set_session/', views.set_session), path('get_session/', views.get_session), path('class_login/', views.LoginView.as_view()) ]
4. 模板语法
准备将要渲染到页面的数据:
class LoginView(View): def get(self, request): # 假设从数据库中查询出来的姓名为 张三 name = '张三' # 将数据传递给模板,需要使用字典进行传递 context = { 'name': name, 'age': 24, 'birthday': datetime.now(), 'friends': ['tom', 'jack', 'rose'], 'money': { '2019': 12000, '2020': 15000, '2021': 20000 } } # render第一个参数为请求对象,第二个参数为模板路径,第三个参数为数据字典 return render(request, 'index.html', context) def post(self, request): return HttpResponse('post')
4.1 模板变量
变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。
模板变量的变量名要与传递进来的数据的变量名一致
语法如下:
{{ 模板变量 }}
模板变量可以使python的内建类型,也可以是对象。
4.2 获取指定的数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> {# name 为模板等待接收的数据,需要View查询数据库传入模板 #} <h1>你好 {{ name }}</h1> <p>年龄:{{ age }}</p> <p>生日:{{ birthday }}</p> <p>朋友:{{ friends }}</p> {# 获取列表中的某个元素,使用点+下标的方式进行获取 #} <p>女朋友:{{ friends.2 }}</p> {# 获取字典中的某个元素,使用点+key的形式获取 #} <p>第一年的薪资:{{ money.2019 }}</p> </body> </html>
4.3 模板中的for循环
语法:
{% for item in items %} 循环体 {% endfor %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> {# name 为模板等待接收的数据,需要View查询数据库传入模板 #} <h1>你好 {{ name }}</h1> <p>年龄:{{ age }}</p> <p>生日:{{ birthday }}</p> <p>朋友:</p> <ul> {# for 循环 #} {% for friend in friends %} {# forloop.counter 获取循环的次序,forloop.count0 获取下标 #} <li>{{ forloop.counter }} {{ forloop.counter0 }} {{ friend }}</li> {% endfor %} </ul> {# 获取列表中的某个元素,使用点+下标的方式进行获取 #} <p>女朋友:{{ friends.2 }}</p> {# 获取字典中的某个元素,使用点+key的形式获取 #} <p>第一年的薪资:{{ money.2019 }}</p> </body> </html>
4.4 if语句
语法:
注意:符号的两边要有空格
{% if age < 10 %} ... {% elif age >= 10 and age < 20 %} ... {% else %} ... {% endif %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> {# name 为模板等待接收的数据,需要View查询数据库传入模板 #} <h1>你好 {{ name }}</h1> <p>年龄:{{ age }}</p> <p> {% if age < 10 %} 年龄小于10 {% elif age >= 10 and age < 20 %} 年龄大于10小于20 {% else %} 年龄大于20 {% endif %} </p> <p>生日:{{ birthday }}</p> <p>朋友:</p> <ul> {# for 循环 #} {% for friend in friends %} {# forloop.counter 获取循环的次序,forloop.count0 获取下标 #} <li>{{ forloop.counter }} {{ forloop.counter0 }} {{ friend }}</li> {% endfor %} </ul> {# 获取列表中的某个元素,使用点+下标的方式进行获取 #} <p>女朋友:{{ friends.2 }}</p> {# 获取字典中的某个元素,使用点+key的形式获取 #} <p>第一年的薪资:{{ money.2019 }}</p> </body> </html>
4.5 模板语法中的运算符
比较运算符如下:
== != < > <= >=
布尔运算符如下:
and or not
4.6 模板语法中的注释
1)单行注释语法如下:
{# 注释内容 #}
2)多行注释使用comment标签,语法如下:
{% comment %} 注释内容 {% endcomment %}
5. 过滤器
过滤器的本质为一个函数。
语法如下:
变量|过滤器:参数
- 使用管道符号
|
来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。 - 如果过滤器需要参数,则使用冒号
:
传递参数。
常见的过滤器:
- safe,禁用转义,告诉模板这个变量是安全的,可以解释执行
- length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
- default,默认值,如果变量不存在时则返回默认值。
- date,日期,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:
- Y表示年,格式为4位,y表示两位的年。
- m表示月,格式为01,02,12等。
- d表示日, 格式为01,02等。
- j表示日,格式为1,2等。
- H表示时,24进制,h表示12进制的时。
- i表示分,为0-59。
- s表示秒,为0-59。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello world</h1> {# name 为模板等待接收的数据,需要View查询数据库传入模板 #} <h1>你好 {{ name }}</h1> <p>年龄:{{ age }}</p> <p> {% if age < 10 %} 年龄小于10 {% elif age >= 10 and age < 20 %} 年龄大于10小于20 {% else %} 年龄大于20 {% endif %} </p> <p>生日:{{ birthday|date:'Y-m-d H:i:s' }}</p> <p>朋友:</p> <ul> {# for 循环 #} {% for friend in friends %} {# forloop.counter 获取循环的次序,forloop.count0 获取下标 #} <li>{{ forloop.counter }} {{ forloop.counter0 }} {{ friend }}</li> {% endfor %} </ul> {# 获取列表中的某个元素,使用点+下标的方式进行获取 #} <p>女朋友:{{ friends.2 }}</p> {# 获取字典中的某个元素,使用点+key的形式获取 #} <p>第一年的薪资:{{ money.2019 }}</p> </body> </html>