DTL与普通HTML文件区别
DTL模板是一种带有特殊语法的HTML文件,这个文件可以别Django编译
渲染模板:
- render_to_string:找到模板,然后将模板编译后渲染成python的字符串格式。最后在通过HttpResponse类包装成一个HttpResponse对象返回回去。示例: html文件快捷键创建 查看已有的 下面是模板的使用代码
这里还学习了os.path.dirname()方法的深入学习
(1)os.path.dirname会去掉一个路径,可以套用
(2)文件运行的可以用os.path.dirname(__file__)
- 直接将模板渲染成字符串和包装成HttpRespose对象一步到位,示例:
- 模板变量
(1)模板使用变量,将变量放入’{{}}’中
(2)如果想要访问对象的属性,那么可以通过“对象.属性” 要用person.username去访问
(3)如果想要访问一个字典的key对应的value,只能通过’字典.key’,不能通过 ‘中括号[]’访问,如果想要访问列表或者元组也是通过“.”访问
Person.username 去获取 韩芳
Person.password.0 去获取 123
Person.password.2 去获取 789
(4)因为在访问字段的key的时候也是使用的‘点’,来访问,因此不能再字段中定义字典本身就有的属性名当做 ‘key’
- 常用标签
- if标签
(1)所有的标签都是在‘{%%}’之间
(2)If标签有闭合标签。{%endif%}
(3)If 标签的判断运算符,和python中判断运算符一样,‘==、!=、<、<=、>、>=、 in、not in、is、is not’都可以使用
(4)还可以使用else和elif标签。
代码实例:Views.py
from django.http import HttpResponse from django.shortcuts import render def index(request): # context = { # "age": 18 # } context = { 'heros':['鲁班一号', '项羽', '程咬金'] } return render(request,"index.html",context=context)
Index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# {% if age1 < 18 %}#} {# <p>您是未成年人不能进入网吧</p>#} {# {% elif age == 18 %}#} {# <p>您是成年人,可以进入网吧</p>#} {# {% else %}#} {# <p>您成年了,需要担负家庭责任,不能进入网吧</p>#} {# {% endif %}#} {% if '鲁班一号' in heros %} <p>鲁班一号在工作</p> {% else %} <p>鲁班一号在睡觉</p> {% endif %} </body> </html>
- for标签
(1)ul标签是无序标签
(2)for…in…标签 可以遍历列表、元组、字符串、字典等一切可以遍历的对象(集合有点特殊)
(3)在for循环中,DTL提供了一些变量使用
forloop.counter 当前循环的下标,从1开始
forloop.counter0当前循环的下标,从0开始
forloop.revcounter当前循环的反向下标
forloop.first 是否是第一次遍历
forloop.last 是否是最后一次遍历
forloop.parentloop 上一级的for循环
(4)For…in…empty 如果遍历的内容为空时,会走empty的代码
(5)遇到一个报错检查出原因记录下:需要是dict类型,包{}换成[]就好了
def index(request): context= { 'books':[ { 'name':'水浒传', 'author':'施耐庵', 'price':109 }, { 'name': '西游记', 'author': '吴承恩', 'price': 299 }, { 'name': '红楼梦', 'author': '曹雪芹', 'price': 399 }, { 'name': '三国演义', 'author': '罗贯中', 'price': 199 } ], 'person':{ 'name':'zuotian', 'height':180, 'great':23 }, 'comments':[ ], 'mystrings':"mystring", 'mylists':[[12,13,14],[15,16,17]], #'mylists': [1, 2, 3], 'mydicts':{'1':1,'2':2}, #'mysets':{{'1':1},{"2":2}},集合里面的元素是list、dict的话是不能遍历的,嵌套遍历也解决不了 #'mysets': {[1,2],[4,6]}, 'mysets': {"dsf",'wer'}, 'mytuples':(1,2,3) } return render(request,"index.html",context=context)
index.html内容 <ul> {% for key in person.keys %} <li>{{ key }}</li> {% endfor %} </ul> <ul> {% for key,value in person.items %} <li>{{ key }}:{{ value }}</li> {% endfor %} </ul> <table> <thead> <tr> <td>序号从1开始</td> <td>序号从0开始</td> <td>序号反向</td> <td>书名</td> <td>作者</td> <td>价格</td> </tr> </thead> <tboby> {% for book in books %} {% if forloop.first %} <tr style="background: pink"> {% elif forloop.last %} <tr style="background: aqua"> {% else %} <tr> {% endif %} <td>{{ forloop.counter }}</td> <td>{{ forloop.counter0 }}</td> <td>{{ forloop.revcounter }}</td> <td>{{ book.name }}</td> <td>{{ book.author }}</td> <td>{{ book.price }}</td> </tr> {% endfor %} </tboby> </table> <ul> {% for comment in comments %} <li>{{ comment }}</li> {% empty %} <li>什么也没有的情况</li> {% endfor %} </ul> <ul> <p>mystring</p> {% for mystring in mystrings %} <li>{{ mystring }}</li> {% endfor %} <p>mylist</p> {% for mylist in mylists %} {% for i in mylist %} <li>{{ forloop.parentloop.counter }}</li> {% endfor %} {% endfor %} <p>mydicts</p> {% for mydict in mydicts %} <li>{{ mydict }}</li> {% endfor %} <p>mysets</p> {% for myset in mysets %} <li>{{ myset }}</li> {% endfor %} <p>mytuples</p> {% for mytuple in mytuples %} <li>{{ mytuple }}</li> {% endfor %} </ul>
- with标签
(1)作用:在模板中创建变量
(2)两种方式:with xx=xxx的形式(等号两边不能有空格),with xxx as xx的形式
(3)定义的变量只能在with语句块中使用,在with语句块外使用取不到这个变量
代码实例:
def index(request): context = { 'heros':['鲁班一号', '项羽', '程咬金'] } return render(request,"index.html",context=context)
index.html {% with hf=heros.0 %} <p>{{ hf }}</p> {% endwith %} {% with heros.0 as hf %} <p>{{ hf }}</p> {% endwith %}
- autoescape标签
(1)spaceless标签:移除html标签中的空白字符,包括空格、tab、换行等,但是不会移除标签和文本之间的空白字符。
实例1:
{% spaceless %} <p> <a href="foo/">foo</a> </p> {% endspaceless %} 查看网页源码,会渲染为: <p><a href="foo/">foo</a></p> 实例2: {% spaceless %} <strong> hello </strong> {% endspaceless %} 查看网页源码,会渲染为:
(2)作用:自动转义功能的开启和关闭,模板默认是开启状态
(3)如果你不知道自己在干什么,最好使用DTL的自动转义,这样网站不容易出现xss漏洞
实例:
Views.py中 def index(request): context = { 'info':"<a href='www.baidu.com'>百度</a>" } return render(request,"index.html",context = context)
{{ info }} <a href='www.baidu.com'>百度</a>
网页中渲染:
实例2:
修改index.html
{% autoescape off %} {{ info }} {% endautoescape %} <a href='www.baidu.com'>百度</a>
- url标签
(1)在模板中,我们经常要写一些url,比如某个a标签定义href属性,当然如果通过硬编码的方式直接将这个url写死在里面也是可以的。但是这样对于以后项目维护可能不是一件好事。因此建议使用这种反转的方式来实现,类似与django中的reverse一样。
(2)如果url反转的时候需要传递参数,分位置参数、关键字参数,不能同时使用
(3)如果url标签反转的时候要传递查询字符串的参数,需要手动添加,多个参数空格分隔
例子:
def login(request): next = request.GET.get('next') text = '登录页面,登录完成跳转的页面的url是:%s' % next return HttpResponse(text) def book(request): return HttpResponse("读书页面") def book_detail(request,book_id,categroy="分类"): text = "你的图书 id:%s,分类是:%s" % (book_id,categroy) return HttpResponse(text) def movie(request): return HttpResponse("电影页面") def city(request): return HttpResponse("同城页面")
<head> <meta charset="UTF-8"> <title>Title</title> <style> .nav{ overflow: hidden; } .nav li{ float: left; list-style: none; margin: 0 20px; } </style> </head> <ul class="nav"> <li><a href="/">首页</a></li> <li><a href="{% url 'book' %}">读书</a></li> <li><a href={% url 'movie' %}>电影</a></li> <li><a href="/city/">同城</a></li> {# <li><a href="{% url 'detail' '23' %}">最火的一片文章</a></li>#} <li><a href="{% url 'detail' book_id='23' categroy="我也不到是啥" %}">最火的一片文章</a></li> <li><a href="{% url 'detail_noCategroy' book_id='33' %}">最火</a></li> <li><a href="{% url 'login' %}?next=/">登录</a></li> </ul>
区分app时使用应用命名空间
- verbatim标
(1)作用:解析特殊字符,使用场景有,多个模板混合情况
示例:index.html {% verbatim %} {{ hello }} {% endverbatim %}
浏览器效果: