python的Web框架,Django模板变量,过滤器和静态文件引入

HTML模板的路径查找

在setting中设置查找路径:css

1 #默认的查找在此处填写,优先级最高,为在manage.py的同级路径中,添加(常规是template)文件夹,在(template)文件夹中配置HTML文件
2 
3 默认路径地址: 4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 1 TEMPLATES = [  2  {  3         'BACKEND': 'django.template.backends.django.DjangoTemplates',  4         
 5         #优先查找的路径'DIR',对其进行拼接。
 6         'DIRS':[os.path.join(BASE_DIR,'templates')]  7         
 8         #若是此处为True,则会查找INSTALLED_APPS内注册的目录路径下,会在app下的templas文件夹中寻找
 9         'APP_DIRS':Ture 10     
11         'OPTIONS': { 12             'context_processors': [ 13                 'django.template.context_processors.debug', 14                 'django.template.context_processors.request', 15                 'django.contrib.auth.context_processors.auth', 16                 'django.contrib.messages.context_processors.messages', 17  ], 18  }, 19  }, 20 ]

 

若是APP_DIRS为True,则会在'DIRS'找完以后,在'INSALLSE_APPS'的列表目录下寻找html

 1 INSTALLED_APPS = [  2     #注册目录
 3     'teacher.apps.TeacherConfig'
 4     'teacher':能够如此简写  5     
 6     'django.contrib.admin',  7     'django.contrib.auth',  8     'django.contrib.contenttypes',  9     'django.contrib.sessions', 10     'django.contrib.messages', 11     'django.contrib.staticfiles', 12 ]

 

只要找到了符合的模板就返回,再也不向下继续找了,因此优先级和路径很重要python


 

静态页面,动态页面

静态页面是没有改变,获取到网页后,是固定样式的; 动态页面是和服务器有交互的页面,在与服务器交互后,返回的页面会有不一样的页面返回给浏览器django

context 模板变量

view中传递数据给html页面,命名规则不能如下划线开头,其余同python,变量的值能够是任何数据类型跨域

context={'key':value} 例: #view文件内配置传送:
     def index(request): now = datetime.now() return render(request, 'index.html',context={ 'nows':now #此处对应的字典传送给index.html
 }) # index模板文件内配置接受:
     <body>
        <h2>当前时间为:{{nows}}</h2>
        #此处的nows是对应的view文件中的key
     </body>

 

时间格式设置,设置的时间格式并非咱们想要的时区时间,就须要修改时间的参数。浏览器

setting中设置:
1 TIME_ZONE = 'Asia/Shanghai'

 

模板变量各类方法:安全

html接受的语法及输出的结果:下列的列表、字典、函数等须要再views文件中配置才能够接受服务器

 1 <body>
 2     列表:lt = [1,2,3]  3         <p>我是一个列表:{{lt}}</p>   
 4         输出:[1,2,3]  5         <p>我是列表中的第二个值:{{lt.2}}</p>
 6         输出:2
 7         
 8 
 9  函数: 10     <p>我是一个函数:{{func}}</p>
11  输出:函数的结果 12     
13     
14     字典:dt = {'name':'hong','age':18,'items':'abc'} 15     <p>我是一个字典:{{dt}}</p>
16     输出:{'name':'张三','age':18} 17     <p>我是字典的一个值:{{dt.name}}</p>
18  输出:张三 19     
20 
21 
22  其余异议的字典输出: 23     <p>调用字典的一个方法{{dt.items}}</p>
24     输出:abc;  若是字典中没有'items'这个键,则返回的是items的这个字典方法 25         1.首先键值对查找;而后属性或方法调用 26     
27 
28 
29  总结: 30         1、计算变量,将其替换为结果 31         2、遇到(.)的时候,按照如下顺序查找: 32             -1.字典的键值对 33             -2.属性或者方法查找 34             -3.数字索引查找 35         3、若是结果是可调用的,则调用它时不带参数,调用的结果为模板的值 36         
37         **渲染失败返回空**
38 </body>

 


模板过滤器

传递的参数例子,为一下内容提供参数例子session

1 now = datetime.now() 2 
3 lt = [1,2,3] 4 
5 dt = {'name':'张三','age':18,'items':'aBc','text':'i an hua'} 6 
7 def func() 8     return '我是一个函数'

 

日期,时间的格式化date,time
以上列代码传送的参数 时间now为例:
1  <body>
2         <p>当前日期时间{{now|date:"Y年m月d日 H时i分s秒"}}</p>
3         <p>当前时间{{now|time:"H时i分s秒"}}</p>
4     </body>
输出格式的结果为:
1    当前日期时间2019年02月20日 11时53分11秒 2     当前时间11时53分11秒

 

date和time过滤器格式app

Y:四位数的年。如:1999 y:两位数的年。如:99 m:两位数的月。如:01, 09 n:一位数的月。如:1, 9, 12 d:两位数的日。如:01, 09, 31 j:一位数的日。如:1, 9, 12 g:12小时制的一位数小时。如:1, 9 ,12 G:24小时制的一位数小时。如:0, 8 ,23 h:12小时制的两位数小时。如:01, 09, 12 H:24小时制的两位数小时。如:01, 13, 24 i:分钟。从00-59 s:秒。从00-59

 

add:将参数与值相加,首先尝试转换成整数相加,若是失败,则尝试其余多有可能,{{value|add:'value'}}
1     <p>1列表值的相加:{{ lt.1|add:'3' }}</p>
2     
3     <p>2列表值的相加:{{ lt.1|add:'3.5' }}</p>
4     <p>2列表值的相加:{{ lt.1|add:3.5 }}</p>
5     
6     <p>函数的值为{{ func|add:'haha' }}</p>

 

输出结果

1     1列表值的相加:5
2     
3  2列表值的相加: 4     2列表值的相加:5
5     #add后面的值若是是str类型不是整数则渲染失败,返回为空,若是是int类型则会转成整数再相加
6     
7     3函数的值为:我是一个函数haha

 

capfirst:首字母大写
1     <p>首字母的大小写方法:{{ dt.items|capfirst }}</p>

 

输出结果

1     首字母的大小写方法:ABc

 

default:若是变量解析失败,则返回给定的默认值,当value是''空字符串,也会输出默认值。
 1 例子  2 def func(aa):  3     return '带参数的函数'
 4 def func():  5     return '''
 6 def func(aa):  7  return None  8     
 9 
10  <p>解析失败则返回默认值:{{ func|default:"nothing" }}</p>

输出结果

1         解析失败则返回默认值:nothing

 

first,last:第一个元素和最后一个元素
1     <p>列表的第一个元素:{{ lt|first }}</p>
2     <p>列表的最后一个元素:{{lt|last}}</p>

 

输出结果

1     列表的第一个元素:1
2     列表的最后一个元素:3

 

slice:切片
1     <p>我是列表的倒序:{{ lt|slice:"::-1"}}</p>

 

输出结果:

1     我是列表的倒序:[3,2,1]

 

join:链接字符串列表,与str.join(list)同样
1     <p>把字典的value链接起来:{{ dt.name|join:"xxx"}}</p>

 

输出结果

1     把字典的value链接起来:张xxx三

 

floatformat:浮点数格式化,不指定小数位参数,默认保留一位
 value Template Output(结果) 34.23234         {{ value|floatformat}}             34.2
    34.23234         {{ value|floatformat:3}}           34.232

 

length,length_is:返回字符串或列表的长度
1     <p>列表的长度是:{{ lt|length}}</p>
2     <p>列表的长度是{{ le|length }}?:{{ lt|length_is:3 }}</p>

 

输出结果

1     列表的长度是:3
2     列表的长度是3吗?:True

 

lower, upper :字符串中的字符都变小写和大写
1     <p>字符都变小写:{{ dt.items|lower }}</p>
2     <p>字符都变大写:{{ dt.items|upper }}</p>

 

输出结果

1  字符都变小写:abc 2     字符都变大写:ABC

 

title:标题化,首字母大写
1     <p>title标题化:{{ dt.text|title }}</p>

 

输出结果:

1     title标题化:I Am Hua

 

过滤器能够用链式的方式:

 只要可以解析出来,就能够接多个的过滤器
{{func
|default:"nothing"|add:"haha"}}

 

safe:关闭变量的自动转义,使html标签生效,xss跨域脚本攻击

反射型和存储型,由于浏览器会解析css和js,因此django帮咱们管理这方面的问题。

js = '<script>alert("1")</script>' html = '<h3>我是安全的,须要渲染成html</h3>'

    <p>{{ html|safe }}</p> 添加了safe后,才会执行这段代码,而不是转义成文本格式。

  我是安全的,须要渲染成html

 


静态文件

settings文件中设置静态文件路径的配置

默认是static,但也能够更改成其余 
1     STATIC_URL = '/static/'
 同时在manage文件的当前目录下,建立static文件夹,在其文件下建立app的文件夹,用于管理静态文件(css,js,img等……)
1     STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

 

静态文件的引入

-硬编码

在css文件夹下建立了同名的css文件。而后在html中的head内引入文件
 html代码
1     <head>
2         <link rel="stylesheet" href="/abab(和setting中的STATIC_URL对应)/teacher/css/index.css">
3     </head>

 

-模板标签,动态解析

 在html的首行(第一行代码) html代码
1     {% load static %} 2     
3     <head>
4         <link rel="stylesheet" href="{% static 'teacher/css/index.css' %}">
5     </head>
相关文章
相关标签/搜索