Django学习3-模板

Django 模板

2中使用django.http.HttpResponse()来输出“Hello World ! ”。该方式将数据与视图混合在一起,不符合MVT思想,将数据和视图分离。
使用2中项目,继续搭建

初步运用实例

1、新建一个runoob.html文件,放在一个同一文件夹下
在这里插入图片描述
2、添加地址 settings中TEMPLATES修改属性’DIRS‘:[os.path.join(BASE_DIR,‘app01’)]
在这里插入图片描述
还可修改为:``‘DIRS’:[BASE_DIR,"/模板文件夹名称"]
3、在views中添加视图函数
-----html中的变量与py变量的对应格式
html:{{变量名}}==py:{‘html的变量名’:py的变量名}
在这里插入图片描述
4、在url中添加对应关系
在这里插入图片描述
效果
注意网址
在这里插入图片描述

Django模板标签–基础

变量

模板语法:

views:{"HTML变量名":"views变量名"}
HTML:{{变量名}}

当views中变量为可迭代对象时,可以通过变量.索引的方式进行索引,
如:

#在views中添加代码
from django.shortcuts import render
def runoob(request):
	views_list={'name':['kris.wang','eric.tan','enzo.chen','wayne.cao']}
	context={"names":views_list}
	return render(request,"runoob.html",context=context)
#在url中添加
urlpatterns=[
	...
	path('runoob/',views.runoob),
]
<!--html-->
...
<body>
<h1>{{names}}</h1>
<h2>{{names.name.0}}</h2>
<h3>{{names.name.1}}</h3>
<h4>{{names.name.2}}</h4>
</body>
...

结果:
在这里插入图片描述

过滤器

模板语法:

{{变量名|过滤器:可选参数}}

用法:
1、在变量被显示前修改它,过滤器使用管道字符。
–如{{name|lower}},变量name被过滤器lower处理后,文档大写转为文本小写
2、过滤管道可以被“套接”,既是说,一个过滤管道的输出又可以作为下一个管道的输入
–如{{my_list|first|upper}},变量my_list将第一个元素转换为大写
3、某些过滤器有参数。过滤器参数跟随冒号之后并且总是以双引号包括。
–如{{bio|truncatewords:"30"}},只选取变量bio的前30个词
4、※其他过滤器:9

  • addslashes:添加反斜杠到任何反斜杠、单双引号或者双引号前面。
  • date:按指定的格式字符串参数格式化date或者datetime对象
    –如{{pub_date:date:"F J,Y"}}
  • length:返回变量长度,适用于字符串和列表,字典返回的是键值对的数量,集合返回的是去重后的长度。
  • default:default为变量提供一个默认值。如果views传的变量对应false时,则使用指定的默认值。
    以下数据为false:
0 0.0 False 0j "" '' [] () set() {} None
  • filesizeformat:以更易读的方式显示文件的大小(即‘13KB’,‘4.1MB’等),字典返回的是键值对的数量,集合返回的是去重的长度。
  • date:根据给定格式对一个日期变量进行格式化,格式Y-m-d H:i:s返回年-月-日 小时:分钟:秒的格式时间。
  • truncatechars:如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分,截断的字符串将以...结尾
  • safe:将字符串标记为安全,不需要转义,使用时要保证后台传来的数据绝对安全才可以使用safe。Django会自动对views传到HTML中的标签语法进行转义,令其语义失效。加safe过滤器是告诉Django该数据是安全的,不必对其进行转义,可以让该数据语义生效。
# views中添加
...
views_str="<a href='https://www.runoob.com/'>点击跳转</a>"
return render(request,"runoob.html",{"views_str":views_str})
...
<body>
{{views_str|safe}}
</body>

在这里插入图片描述

结构标签

  • if/elif/else/endif标签:
    允许使用and or not
{% if 变量1<10 and 变量2>10 %}
	执行体1
{% elif 变量1>10 and 变量2<10 %}
	执行体2
{% else %}
	执行体3
{% endif %}
  • for标签
    使用情况与python的for循环类似,每一次循环中模板系统会渲染{% for %}{% endfor %}之间的所有内容。
    如显示一个列表信息:
<ul>
{% for i in listrange %}<!--在listrange后添加reversed能够反向迭代-->
	<li>{{i.xx}}</li>
{% endfor %}
</ul>
<!--遍历字典时:可以直接用字典.items方法,用变量的解包分别获取键和值-->

在这里插入图片描述

<!--在循环体内可以通过{{forloop}}变量获取循环序号-->
{% for in listrange %}
	{{ forloop.counter}}<!--顺序获取循环序号,从1开始计算-->
	{{ forloop.counter0}}<!--顺序获取循环序号,从0开始计算-->
	{{ forloop.revcounter}}<!--倒序获取循环序号,结尾序号为1-->
	{{ forloop.revcounter0}}<!--倒序获取循环序号,结尾序号为0-->
	{{ forloop.first}}<!--(一般配合if标签使用):第一条数据返回True,其他数据返回False-->
	{{ forloop.last}}<!--(一般配合if标签使用):最后一条数据返回True,其他数据返回False-->
{% endfor %}
<!--使用结果,假设listrannge=["a","b","c","d","e"]-->
1 2 3 4 5
0 1 2 3 4
5 4 3 2 1
4 3 2 1 0
True False False False False
False False False False True
{% empty %}--从句在{% for %}后添加,当listrange为空时执行
{% for %}标签可嵌套使用
  • ifequal/ifnotequal 标签
    {% ifequal %}标签比较两个值,当他们相等时,显示{ % ifequal %}{% endifequal %}之中所有的值{% ifnotequal %}``就是不等
{% ifequal 变量1 变量2 %}
	xxx
{% else %}
	xxx
{% endifequal %}
  • 注释标签
    {# 这是一个注释 #} 直接使用<!---->也可以
  • include标签
    {% include %}标签允许在模板中包含其它的模板的内容
{% include "xx.html" %}
  • csrf_token标签
    用于form表单中,作用是跨站请求伪造保护,如果不用``{% csrf_token %}标签,在用form表单时,再次跳转页面时会报403权限错误。用了该标签,提交数据时才会成功。
    解析:
    工作流程:
    向浏览器发送请求,获取登录页面,此时中间件csrf会自动生成一个隐藏input标签,该标签里的value属性是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。然后用户需要用form表单提交数据时,会携带这个input标签一起提交给中间件csrf,(form表单提交数据会将所有input标签提交),crsf接收数据后会判断这个随机字符串是不是它发给用户的,是-则提交成功,否-则失败。

自定义标签和过滤器-重点

步骤:
1、在模板文件同级目录下建立templatetags;(该文件夹名称固定,不可更改)
2、在templatetags目录下创建任意py文件,如:my_tags.py;
3、my_tags.py文件代码

from django import template
register=template.Library()#register的名字是固定的不可改变

4、修改settings中TEMPLATES选项配置,添加libraries配置

...
TEMPLATES=[
	{
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
            "libraries":{                         
                'my_tags':'templatetags.my_tags'  #py文件名对应         
            }                                      
        },
	},
]
...

5、利用装饰器@register.filter自定义过滤器(装饰器参数最多只能有两个)

@register.filter#自定义过滤器
def my_filter(v1,v2):
	return v1*v2

6、利用装饰器@register.simple_tag自定义标签

@register.simple_tag#自定义标签
def my_tag1(v1,v2,v3):
	return v1*v2*v3

7、使用自定义标签和过滤器前需要在html的body的最开始导入该py文件

{% load my_tags %}

8、在HTML中使用自定义过滤器、自定义标签

{{11|my_filter:22}}

{% my_tag1 11 22 33 %}

9、语义化标签
在该py文件中导入mark_safe

from django.utils.safestring import mark_safe
'''定义标签时,用mark_safe方法,令标签语义化,相当于jQuery中的html()方法
和在前端html中使用过滤器safe效果一样
'''
@register.simple_tag
def my_html(v1,v2):
	temp_html="<input type='text' id='%s' class='%s'/>"%(v1,v2)
	return mark_safe(temp_html)

在html中使用该自定义标签,在页面中动态创建标签

{% my_html "zzz" "xxx" %}

配置静态文件-基础

1、项目根目录下创建statics目录(与manage同级)
2、在settings文件的最下方配置添加以下配置

STATIC_URL='/static/'#别名
STATICFILES_DIRS=[os.path.join(BASE_DIR,"statics"),]

3、statics目录下创建css目录,js目录images目录,plugins目录,分别放css文件,js文件,图片,插件
4、把bootstrap框架放入插件目录plugins
5、在html文件的head标签中引入bootstrap(前端框架)

<link rel="stylesheet" href="/static/plugins/bootstrap.css">
<!--在body添加{% load static %}代码-->
<!--从静态目录中引入图片-->
<img src="{% static 'images/runoob-logo.png' %}" alt="runoob-logo">

模板继承–重点

模板可以用继承的方式来实现复用,减少冗余内容。
网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。
父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。

使用标签block…endblock

{% block 名称 %}
	预留给子模版的区域,不同预留区域名称不能相同
{% endblock 名称 %}


使用extends继承父模板
子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,当然也可以都不设置,就为空。
一旦继承,没有预留区域的子内容都会被洗掉

{% extends "父模板路径"%}
<!--+需要修改的预留区域-->
{% block 名称 %}
	内容
{% endblock 名称 %}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值