template是模板的意思
这个文件夹和他的字面意思是一样的,里面是放模板的,templates里面的文件不全是html语言里面是有HTML代码+逻辑控制代码组成的
#首先是变量
{{var}},对这个就是变量,我们在之前已经用过很多次了{{user}}这个就是在视图里定义的然后返回到了我们的模板里
万能的句点,在逻辑控制代码中,数组、字典、列表函数里的属性等等都可以通过句点来实现
#变量过滤器(filter)的使用
语法格式:{{obj|filter:param}}#这个可以参考defaultfilters里面的过滤器函数
@register.filter(is_safe=True)
@stringfilter
def addslashes(value):
“”"
Adds slashes before quotes. Useful for escaping strings in CSV, for
example. Less useful for escaping JavaScript; use the escapejs
filter instead.
“”"
return value.replace(’\’, ‘\\’).replace(’"’, ‘\"’).replace("’", “\’”)
@register.filter(is_safe=True)
@stringfilter
def capfirst(value):
“”“Capitalizes the first character of the value.”""
return value and value[0].upper() + value[1:]
@register.filter(“escapejs”)
@stringfilter
def escapejs_filter(value):
“”“Hex encodes characters for use in JavaScript strings.”""
return escapejs(value)
里面还有很多,如果我们要自己写过滤器也要参照这个里面的格式写出自己需要的过滤器,这里先说在几个,如果感兴趣可以看看源代码里面的其他方法
1、add :给变量加上相应的值{{var|add:int}}
2、addslashes:给变量中的引号前加上斜线
3、capfirst:首字母大写
4、cut:从字符串中移除指定的字符
5、data:格式化日期字符串
6、default:如果值是False,就替换成设置的默认值,否则这就是用本来的值
7、default_if_none: 如果值是False,就替换成设置的默认值,否则这就是用本来的值
#标签tag的使用
{%tags%}
#{%if%}和Python 里面的差不多不过多了一个{%endif%}
#{%for%}和Python 里面的差不多不过多了一个{%endfor%}
#{%csrf_token%} 用于生成csrf_token标签,用于防止跨站攻击验证
#{%url%} 引用路由配置的地址,这个是我们用过的,还记得url路由分发里面的别名吗?对就是他
#{%load%} 加载标签库,这个我们也用过就是加载jquery时
#下面在说下自定义的filter和tag
1、在app中创建templatetags模块(这个是必须的)
2、创建任意.py文件,如:my_tags.py
3、在使用自定义simple_tag和filter的html文件中导入之前创建的my_tags.py:{%load my_tags%}
4、使用simple_tag和filter(如何调用)
5、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自动的simple_tag
6、filter只能有一个参数,而tag可以有多个,filter可以用在if等语句后,但是simple_tag不可以
这个是在templatetags文件加下建立的filter1.py文件
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter(name='filter_multi')
def filter_multi(a,b):
return a*b
@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)
这个是我们用到的index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% load staticfiles %}
{% load filter1 %}
<title>Django Page</title>
<style>
*{
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<h1>Hello Django!啦啦啦</h1>
{# <script src="/static/jquery-3.1.1.js"></script>#}
<script src="{% static 'jquery-3.1.1.js' %}"></script>
<script>
$("h1").css("color","red")
</script>
<p>{{ value2|add:3 }}</p>
<p>{{ a|capfirst }}</p>
<p>{{ a|addslashes }}</p>
<p>{{ time }}</p>
<p>{{ time|date:'Y-m-d' }}</p>
<p>{{ value2|filter_multi:3 }}</p>
<p>{% my_input 2 'hellp' %}</p>
<div>
{% if value2 < 10 %}这个地方必须加空格
<p>
5是小于10的
</p>
{% endif %}
</div>
</body>
</html>
STATIC主要指的是如css,js,images这样文件,在settings里面可以配置STATIC_ROOT和STATIC_URL,
配置方式与MEDIA_ROOT是一样的,但是要注意
#STATIC文件一般保存在以下位置:
#1、STATIC_ROOT:在settings里面设置,一般用来放一些公共的js,css,images等。
#2、app的static文件夹,在每个app所在文夹均可以建立一个static文件夹,然后当运行collectstatic时,
# Django会遍历INSTALL_APPS里面所有app的static文件夹,将里面所有的文件复制到STATIC_ROOT。因此,
# 如果你要建立可复用的app,那么你要将该app所需要的静态文件放在static文件夹中。
# 也就是说一个项目引用了很多app,那么这个项目所需要的css,images等静态文件是分散在各个app的static文件的,比
# 较典型的是admin应用。当你要发布时,需要将这些分散的static文件收集到一个地方就是STATIC_ROOT。
#3、STATIC文件还可以配置STATICFILES_DIRS,指定额外的静态文件存储位置。
# STATIC_URL的含义与MEDIA_URL类似。
# ----------------------------------------------------------------------------
#注意1:
#为了后端的更改不会影响前端的引入,避免造成前端大量修改
STATIC_URL = '/static/' #引用名
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"statics") #实际名 ,即实际文件夹的名字
)
#django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找
#<script src="/statics/jquery-3.1.1.js"></script>
#------error-----不能直接用,必须用STATIC_URL = '/static/':
#<script src="/static/jquery-3.1.1.js"></script>
#注意2(statics文件夹写在不同的app下,静态文件的调用):
STATIC_URL = '/static/'
STATICFILES_DIRS=(
('hello',os.path.join(BASE_DIR,"app01","statics")) ,
)
#<script src="/static/hello/jquery-1.8.2.min.js"></script>
#注意3:
STATIC_URL = '/static/'
{% load staticfiles %}
# <script src={% static "jquery-1.8.2.min.js" %}></script>
HttpResponse对象:
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
在HttpResponse对象上扩展的常用方法:
{%for%}循环
<ul>
{% for obj in list %}
<li>{{ obj.name }}</li>
{% endfor %}
</ul>
#在标签里添加reversed来反序循环列表:
{% for obj in list reversed %}
...
{% endfor %}
#{% for %}标签可以嵌套:
{% for country in countries %}
<h1>{{ country.name }}</h1>
<ul>
{% for city in country.city_list %}
<li>{{ city }}</li>
{% endfor %}
</ul>
{% endfor %}
#系统不支持中断循环,系统也不支持continue语句,{% for %}标签内置了一个forloop模板变量,
#这个变量含有一些属性可以提供给你一些关于循环的信息
1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1:
{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
2,forloop.counter0 类似于forloop.counter,但它是从0开始计数,第一次循环设为0
3,forloop.revcounter
4,forloop.revcounter0
5,forloop.first当第一次循环时值为True,在特别情况下很有用:
{% for object in objects %}
{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
{{ object }}
</li>
{% endfor %}
# 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了
# 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它
# Django会在for标签的块中覆盖你定义的forloop变量的值
# 在其他非循环的地方,你的forloop变量仍然可用
#{% empty %}
{{li }}
{% for i in li %}
<li>{{ forloop.counter0 }}----{{ i }}</li>
{% empty %}
<li>this is empty!</li>
{% endfor %}
# [11, 22, 33, 44, 55]
# 0----11
# 1----22
# 2----33
# 3----44
# 4----55
继承
------include 模板标签
在讲解了模板加载机制之后,我们再介绍一个利用该机制的内建模板标签: {% include %} 。该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。
base.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="jquery-3.1.1.js"></script>
<title>Title</title>
{% block styles %}
{% endblock %}
<style>
* {
margin: 0;
padding: 0
}
.nav{
line-height: 40px;
width: 100%;
background-color: #2459a2;
color: white;
font-size: 20px;
text-align: center;
}
.left{
width: 20%;
min-height: 600px;
overflow: auto;
background-color: lightgrey;
}
.manage{
text-align: center;
padding: 20px 0px;
margin: 20px 0;
font-size: 18px;
}
.left,.content{
float: left;
}
.content{
width: 70%;
min-height: 600px;
}
a{
text-decoration: none;
}
h1,h2{
text-align: center;
}
</style>
</head>
<body>
<div class="outer">
<div class="nav">标题</div>
<div class="left">
<div class="student manage"><a href="/student/">学生管理</a></div>
<div class="teacher manage"><a href="">老师管理</a></div>
<div class="course manage"><a href="">课程管理</a></div>
<div class="classes manage"><a href="">班里管理</a></div>
</div>
<div class="content">
{% block content%}
<h1>WELCOME TO LOGIN</h1>
{% endblock %}
</div>
</div>
</body>
</html>
student.html
{% extends "base.html" %}#通过这个我们继承了"base.html”里面的所有内容
{% load staticfiles %}
{% block styles %}
#我们可以通过{% block%} 这个标签对继承的base.html{% block%} 中的内容进行修改
<style>
h2{
color: red;
}
</style>
{% endblock %}
{% block content %}
{{ block.super }}# 通过{{ block.super }}这个方法,我们可以继承base.heml中{% block content %}标签里的内容
{% for student in student_list %}
<h2>学生{{ student }}</h2>
{% endfor %}
{% include "test.html" %}#通过这个我们可以添加test.html中的内容
{% endblock %}
test.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="jquery-3.1.1.js"></script>
<title>Title</title>
<style>
* {
margin: 0;
padding: 0
}
</style>
</head>
<body>
<h1 style="color: #2459a2">hello world</h1>
</body>
</html>
<1>如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
<2>一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此
你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越
多越好。
<3>如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模
板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
<4>不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。
也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个
相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。
比较乱,以后可能还会重新更新下内容,先这样吧