Django快速入门笔记(5)——模板(html)二三事
写在前面:满打满算,使用Django两个月了。为了赶项目,更多的功能没有时间研究,多少有点小沮丧。编程2年,前端基础0,最近在写一大堆html,一些入门级的小技巧还是可以和大家一起学习和分享的。
我尽量用最简单的示例,把功能展现出来。示例里出现的Python语句,仅仅是可以实现其功能,如有更简洁的代码,跪求指出!!
在学习本章之前,默认大家对 html 文件有了一些最基本的认识。(什么!!你还不知道?手动鼠标右键单击,查看网页源代码)
上图简单展示了Django 模板获取数据的信息流程。
在最初设置的时候,我们已经将所有的模板文件(html)保存在了templates文件夹里,并按照不同的app下设了单独的文件夹。
(如果你的文件结构还不是这样的,可以参考 Django 快速入门笔记(1) )
本篇文章主要对Django自带的 templates 模板语言做一些简单的介绍。正式内容之前,给大家的建议是,能在后端解决的数据处理,尽量不要放在前端!! 有些内容在前面的文章中可能已经提及,这里将它们汇总在一起,方便大家学习和交流。
参考资料: The Django template language(官网)
一、变量
1. 变量传递
{{ various }} //变量
Django模板中约定用 {{ }} 来传递一个变量。
例如,在views.py中,
def index1(request):
ans={} # 创建字典
ans['jian']='hello world'
return render(request,'app001/firstpage.html',ans)
我们定义了一个字典 ans,创建了一个 键 'jian' ,对应值 'hello world'。并用 render 方法,将整个字典 ans 输出给 firstpage.html
当我们想在firstpage.html中显示 'hello world' 时,只需要使用 {{ 键 }} ,就可以了
{{ jian }}
2.变量赋值
可以结合 javascript 重新定义变量。
<script>
var data={{ various }}
</script>
这样简单的赋值,可以将 various 的值 传递给 新定义的变量 data
3.变量过滤器 filters
我们可以利用过滤器,对获取到的数据进行二次加工。
{{ various|length }}
例如,我们利用Django自带的 "length" 过滤器计算变量的长度。如果 various 为列表 [0,1,2],则返回列表长度3
除此之外,Django自带的过滤器还包括,
{{ various|default:"1234" }} // 变量错误或为空时,返回规定的值"1234"
{{ various|add:"2" }} // 如果变量值为4,返回6
更多的自带过滤器可以查询 templates-builtins-filters (官网)
你也可以自定义过滤器(相当于写一个函数)来满足特定的需求,这里就不展开。
建议,能在后端完成的处理过程,尽量放在后端。 如,同样是计算变量长度,可以直接利用查询集QuerySet的 len() 方法来完成。
更多对查询集方法的介绍 querysets(官网)
二、逻辑
Django自带的Tags已经为我们提供了基本的逻辑语言,if,for 等等,用 {% %} 表示调用。
基本的格式是 {% tag %} ... contents ... {% endtag %}
1. if……else if ……else 条件判断
{% if condition1 %}
expression1
{% elif condition2 %}
expression2
{% else %}
expression3
{% endif %}
2. for 循环
{% for items in list1 %}
expression
{% endfor %}
三、杂七杂八的tags
1、动态url
格式形如 {% url 'url_name' %}
举例,
<a href="{% url 'welcome' %}">首页</a>
这里,我们将超链接地址指定到 name 为 'welcome' 的 url 上。
在url.py文件中
urlpatterns =[
url(r'^$',views.test1,name='welcome')] # name定义为welcome
这样写的好处是,html 和 url_name 绑定,url的 地址 以及 对应的 views 可以任意修改。
2、引入头文件 static
js,css类的文件,我们统一保存在了static文件夹中,如果想要在头文件中引入。
首先应该 {% load static %}
<head>
{% load static %}
<!--css文件-->
<link rel="stylesheet" href="{% static 'bootstrap.min.css' %}">
<!--js文件-->
<script src="{% static 'bootstrap.min.js' %}"></script>
</head>
上面例子以bootstrap为例,首先引入css类文件,再引入js文件。
引入格式, {% static 'bootstrap.min.css' %},引号'' 中为引入文件在static文件夹中路径。
如果,bootstrap.min.css 文件保存在了“static/app001/bootstrap.min.css”位置,则引入格式为{% static 'app001\bootstrap.min.css' %}
3、跨站点保护请求
使用格式, {% csrf_token %},配合 post 使用
<form action="/app001" method="post">
{% csrf_token %}
<p>姓名:<input type="text" name="name1"></p>
<input type="submit" value="确定">
</form>
四、模板继承
1、block
一个多功能网站一般会有统一的风格,例如统一的导航栏,相似的页面布局等等,这些在html文件中都是重复的代码,会造成代码冗长。我们无须在每一个html中重复编写这些代码,只需将统一的部分提出来,单独遍写出一个base模板,在需要套用模板的html中调用这个base就可以了。
首先在base.html中编写固定不变的部分,
将变动的部分用以下代码代替,
{% block XX %}{% endblock %}
或者
{% block XX %}中间的部分是可以替换的,也可以设定默认值{% endblock %}
例如,每个页面的 title 是变动的,在编写模板base.html的时候,
<title>{% block title %}默认{% endblock %}</title>
这段代码表示,ttitle是可以变化的,在没有指定的情况下,title为默认。
接下来,我们在app001.html中调用这个base.html
{% extends "base.html" %}
{% block title %}首页{% endblock %}
首先用extends引入我们需要用到的模板,引号“”中为模板在templates文件夹下的地址,如果我们将base.html保存在了“templates/app001/base.html”中时,{% extends "app001/base.html" %}
接下来,替换模板中的block title,这里是将“默认”,替换成了“首页”。
通过模板的这种继承方式,我们可以省去许多冗长重复的代码部分,特别是需要统一修改网站的风格布局,或者导航栏的时候,只需要修改base文件,那么引入了base模板的所有网页都修改完成了,无须一个一个更改。
2、include
另外,我们可以使用include, 将每一个网页的小功能打包成html ,然后include该html
{% include "app001/tets1.html" %}
这里表示,将test1.html 文件包含进来。
使用include的好处是,可以方便得更改网站布局。由于每个小功能的代码都被分开打包了,我们在重新排版的时候,只需要在适当的地方include每个功能就好, 而不需要将大段大段的代码剪切下来再粘贴到新的地方。
这里,贴一个示例,给大家感受一下,block 和 include 结合使用后,html 的整洁程度
{% extends "firstpage/base.html" %} <!--引入base模板-->
{% block title %}示例{% endblock %} <!--替换 title 部分-->
{% block content %} <!--替换 content 部分-->