模板

如果使用react实现前端页面,其实Django就没有必要使用模板,它其实就是一个纯后台服务程序,接收请求,响应数据,前后端接口设计就可以是纯粹的Restful风格
模板的目的是为了可视化,将数据按照一定布局格式输出,而不是为了数据处理,所以一般不会有负责的处理逻辑,模板的引入实现了业务逻辑和显示格式的分离,这样,在开发中,就可以分工协作了,页面开发完成页面布局设计,后台开发完成数据处理逻辑的实现
Python的模板引擎默认使用Django template language(DTL)构建

模板设计

在settings.py中,设置模板项目的路径

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 这一句取项目根目录
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',
],
},
 },
]
  • DIRS:列表,定义模板文件的搜索路径顺序。os.path.join(BASE_DIR,‘templates’)即项目根目录下templates目录,请构建这个目录
  • APP_DIRS:是否运行在每个已经安装的应用中查找模板。应用自己目录下有templates目录
  • BASE_DIR是项目根目录,os.path.join(BASE_DIR,‘templates’)就是在manage.py这一层建立一个目录templates。这个路径就是以后默认找模板的地方
模板渲染

模板页

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>马哥教育Django首页</title>
</head>
<body>
我是模板,数据是{{content}}
</body>
</html>

将模板Index.html放入到templates目录下

模板处理
2个步骤
1、加载模板
模板是一个文件,需要从磁盘读取并加载,要将模板放入到templates目录下
2、渲染
模板需要使用内容数据来渲染,生成HTML文件内容

rom django.template import loader
def index(request:HttpRequest):
    """视图函数,请求进来返回响应"""
    template=loader.get_template('index.html') # 加载器模块搜索模板并加载它
    print(template.origin)# 显示模板路径
    context={'content':'https://cn.bing.com/?mkt=zh-CN'} # 数据字典
    return HttpResponse(template.render(context,request))

render快捷渲染函数

上面2个步骤代码编写繁琐,Django提供了对其的封装–快捷函数render

render(request,template_name,context=None)

返回HttpResponse对象
template_name模板名称
context数据字典
render_to_string()是其核心方法,其实就是拿数据替换HTML中的指定位置后返回一个字符串

from django.shortcuts import render
def index(request:HttpRequest):
"""视图函数,请求进来返回响应"""
return render(request,'index.html',{'content':'https://cn.bing.com/?mkt=zh-CN'})

在这里插入图片描述
使用浏览器访问首页,能够正常显示

DTL语法
  • 变量
  • 标签
  • 注释
  • 过滤器
    1、变量
语法 {{variable}}

变量名由字母、数字、下划线、点号组成
点号使用的时候,遵循以下顺序:

  • 字段查找,例如foo["bar],把foo当做字典,bar当做key
  • 属性或方法的查找,例如foo.bar,把foo当做对象,bar当做属性或方法
  • 数字索引查找,例如foo[bar],把foo当做列表一样,使用索引访问
def index(request:HttpRequest):
    """视图函数,请求进来返回响应"""
    my_dict={
        'a':100,
        'b':0,
        'c':list(range(10,20)),
        'd':'abc',
        'data':datetime.datetime.now()
    }
    context={'content':'https://cn.bing.com/?mkt=zh-CN','my_dict':my_dict}
    return render(request,'index.html',context)

如果变量未能找到,则缺省插入空字符串
在模板总调用方法,不能加小括号,所以不能传递参数
{{my_dict.a}}符合第一条,当做当做字典的key就可以访问到
{{my_dict.keys}}是对的,不能写成{{my_dict.keys(()}}。符合第二条,当做my_dict对象的属性或方法
2、模板标签
if /else标签
基本语法格式如下:

{% if condition %}
		…display
{% endif %}

或者

{% if condition1 %}
	…display1
{% elif condition2 %}
	…display2
{% else%}
	…display3
{% endif %}

条件也支持and、or、not
注意,因为这些标签是断开的,所以不能像Python一样使用缩进就可以表示出来,必须有个结束标签,例如endif、endfor。
for标签
https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#for

<ul>
{% for athlete in athlete_list %}
	<li>{{athlete.name}}</li>
{% endfor %}
</ul>

{% for person in person_list %}
<li> {{person.name}}</li>
{% endfor %}
变量说明
forloop.counter当前循环从1开始的计数
forloop.counter0当前循环从0开始的计数
forloop.revcounter从循环的末尾开始倒计数到1
forloop.revcounter0从循环的末尾开始计数到0
forloop.first第一次进入循环
forloop.last最后一次进入循环
forloop.parentloop循环嵌套时,内层当前循环的外层循环

给标签增加一个reversed使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% empty %}
... 如果被迭代的列表是空的或者不存在,执行empty
{% endfor %}

可以嵌套使用{% for %}标签:

{% for athlete in athlete_list %}
 <h1>{{ athlete.name }}</h1>
 <ul>
 {% for sport in athlete.sports_played %}
 <li>{{ sport }}</li>
 {% endfor %}
 </ul>
{% endfor %}
<!DOCTYPE html>
<html lang="en">
<head>
ifequal/ifnotequal 标签
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :
和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:
 <meta charset="UTF-8">
 <title>测试for</title>
</head>
<body>
字典是dict(zip('abcd',range(1,6)))
<ul>
    {% for k,v in my_dict.dict.items %}
    <li>
        {{forloop.counter}} {{k}} {{v}}
    </li>
    {% endfor %}
</ul>

<ul>
    {% for k,v in my_dict.dict.items %}
        {{forloop.first}}
        {{forloop.last}}
    <li>
        {{forloop.revcounter0}} {{k}} {{v}}
    </li>
    {% endfor %}
</ul>

<ul>
    {% for k,v in my_dict.dict.items %}
    <li>
        {{forloop.revcounter}} {{k}} {{v}}
    </li>
    {% endfor %}
</ul>
</body>
</html>

在这里插入图片描述
ifequal/ifnotequal标签
{% ifequal %}标签比较两个值,当他们相等时,显示在显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}
 <h1>Welcome!</h1>
{% endifequal %}

其他标签
csrf_token 用于跨站请求伪造保护,防止跨站攻击的。
{% csrf_token %}
注释标签
单行注释 {# #}。
多行注释 {% comment %} … {% endcomment %}.

{# 这是一个注释 #}
{% comment %}
这是多行注释
{% endcomment %}.

过滤器
模板过滤器可以在变量被显示前修改它

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值