WebFramework-Basis-3rd
周一,晴,记录生活分享点滴
参考博客1:https://www.cnblogs.com/yuanchenqi/articles/6083427.html
参考博客2:https://www.cnblogs.com/5poi/p/6649101.html
Django 1.3
模版的组成
HTML代码+逻辑控制代码
模版的渲染
>>> python manange.py shell (进入该django项目的环境) >>> from django.template import Context, Template >>> t = Template('My name is {{ name }}.') >>> c = Context({'name': 'Stephane'}) >>> t.render(c) 'My name is Stephane.'
逻辑控制代码的组成
变量
语法格式:使用双大括号来引用变量
{{var_name}}
Template和Context对象
>>> python manange.py shell (进入该django项目的环境) >>> from django.template import Context, Template >>> t = Template('My name is {{ name }}.') >>> c = Context({'name': 'Stephane'}) >>> t.render(c) 'My name is Stephane.' # 同一模板,多个上下文,一旦有了模板对象,你就可以通过它渲染多个context,无论何时我们都可以 # 像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染会更为高效: # Low for name in ('John', 'Julie', 'Pat'): t = Template('Hello, {{ name }}') print t.render(Context({'name': name})) # Good t = Template('Hello, {{ name }}') for name in ('John', 'Julie', 'Pat'): print t.render(Context({'name': name}))
推荐方式
from django.shortcuts import render,HttpResponse from django.template.loader import get_template #记得导入 # Create your views here. import datetime from django.template import Template,Context # 推荐写法 ------------------------------------------------------------------------------------------- def current_time(req): now=datetime.datetime.now() return render(req, 'current_datetime.html', {'current_date':now}) # 原始的视图函数(不推荐)------------------------------------------------------------------------------ def current_time(req): now=datetime.datetime.now() html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now return HttpResponse(html) # django模板修改的视图函数(不推荐)--------------------------------------------------------------------- def current_time(req): now=datetime.datetime.now() t=Template('<html><body>现在时刻是:<h1 style="color:red">{{current_date}}</h1></body></html>') t=get_template('current_datetime.html') c=Context({'current_date':now}) html=t.render(c) return HttpResponse(html)
句点号(深度变量的查找)
# 后端数据 : s = 'hello' s1 = [1,2] s2 = { 'user':'eriic' } s3 = time.localtime() s4 = Foo( 'eroiic' , 20 ) # 页面取值 : {{ obj.1 }} # 索引取值 {{ obj.user }} # 根据字段key取值 {{ obj.year }} # 根据属性取值 {{ obj.name }} # 取类中字段
Filter(过滤器)
语法格式
{{obj|filter:param}}
方法
add # 给变量加上相应的值 addslashes # 给变量中的引号前加上斜线 capfirst # 首字母大写 cut # 从字符串中移除指定的字符 date # 格式化日期字符串 default # 如果值是False,就替换成设置的默认值,否则就是用本来的值 default_if_none # 如果值是None,就替换成设置的默认值,否则就使用本来的值
实例
# value1="aBcDe" ----------------------------------------------------- {{ value1|upper }} # value2=5 ----------------------------------------------------------- {{ value2|add:3 }} # value3='he llo wo r ld' ------------------------------------------- {{ value3|cut:' ' }} # import datetime ---------------------------------------------------- # value4=datetime.datetime.now() {{ value4|date:'Y-m-d' }} # value5=[] ---------------------------------------------------------- {{ value5|default:'空的' }} # 设置默认值 # value6='<a href="#">跳转</a>' -------------- 【有重点】 -------------- {{ value6 }} # 字符串形式在页面显示 {% autoescape off %} # 渲染成浏览器能解析的标签 {{ value6 }} {% endautoescape %} {{ value6|safe }} # 效果同上(显示“跳转”链接)·【重点】 {{ value6|striptags }} # value7='1234' ------------------------------------------------------ {{ value7|filesizeformat }} # obj 数据的大小 ~kb {{ value7|first }} # 取第一个值 {{ value7|length }} # 得到长度 {{ value7|slice:":-1" }} # 切片 # value8='http://www.baidu.com/?a=1&b=3' ----------------------------- {{ value8|urlencode }} # 进行url编码 # value9='hello I am eriic' ------------------------------------------ {{ value9|truncatechars:'6' }} # 按字符截断 总显示3个点, 占用3个位置! {{ value9|truncatewords:'6' }} # 按单词截断
标签(tag)的使用
使用大括号和百分比的组合来表示使用tag
{% tags %}
1、{% if %} 的使用
不允许同一标签里同时出现and和or,否则逻辑容易产生歧义
{% if num >= 100 and 8 %} {% elif num < 100%} <p>num小于100</p> {% else %} <p>num等于100</p> {% endif %}
2、{% for %}的使用
{% for i in obj %} # obj 为列表 , i 为值 {{ forloop.counter }} # 模拟索引 , 从1开始算 {{ forloop.counter0 }} # 模拟索引 , 从0开始算 {{ forloop.revcounter }} # 反序索引 , 从最后开始算 # obj 为字典 , i 为key , 或者改为: obj.keys obj.values obj.items 进行循环 {% endfor %}
3、{%csrf_token%}
csrf_token标签,放到 form 表单里,生成一个input标签,和其他表单标签一起提交给后台,用于防治跨站攻击验证。
4、{% with %}
用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %}
{{ total }}
{% endwith %}
5、{% verbatim %}
禁止变量被渲染
{% verbatim %} {{ hello }} # 页面直接显示 {{ hello }} {% endverbatim %}
6、{% load %}
加载标签库
自定义filter和simple_tag·重点
-
首先在setting中installed_apps 添加当前的app项目
# settings.py INSTALLED_APPS = [ ... "app01" ]
-
app项目下创建templatetags/tags(名字是固定的,不能变)
-
创建任意文件 如 my_tags.py
-
引入类,自定义函数
from django import template from django.utils.safestring import mark_safe register = template.Library() # register的名字是固定的,不可改变 # filter @register.filter def filter_multi(v1,v2): return v1 * v2 # simple_tag @register.simple_tag def simple_tag_multi(v1,v2): return v1 * v2 @register.simple_tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
-
HTML中使用
{% load my_tags %} # 引入外部文件, 位置在最上面 # 使用: {% my_add 100 101 %} # simple_tag 可以传入多个参数, 不能用于if语句 {{ obj | my_add:num2 }} # filter 最多两个参数, if 语句可以跟filter
include 模板标签 {% include %}
该标签允许在(模板中)包含其它的模板的内容。
标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。
每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %}
来减少重复。
extend(继承)模板标签
减少共用页面区域所引起的重复和冗余代码
-
方法一:解决该问题的传统做法是使用服务器端的 includes ,在 HTML 页面中使用该指令将一个网页嵌入到另一个中。
-
方法二:模板继承是先构造一个基础框架模板,然后在其子模板中对它所包含站点公用部分和定义块进行重载。
#1 -- base.html 存放的是页面共有的代码 .... {% block content %} # 非共有部分用 block代替, block名字(content)自定义 ... {% endblock %} #2 -- order.html 只保留非公有部分的代码 {% extend 'base.html' %} # 继承外部文件,引入模板,位置放在最上面 {% block cotent %} # 非公有部分的代码, 会对base.html中的block进行替换 .... {% endblock %} # 没有对应上的 block 会在base中原样显示 # 如果需要同时显示父级的代码 和自己代码 可以嵌套使用 {{ block.super }}
day55