模板语言(一)
一模版的组成
组成:HTML代码+逻辑控制代码
二 逻辑控制代码的组成
1 变量(使用双大括号来引用变量):
语法格式: {{var_name}}
可以通过双大括号的方式引用后台的变量
Template和Context对象在生成模板的时的关系
>>> python manange.py shell (进入该django项目的环境) >>> from django.template import Context, Template >>> t = Template('My name is {{ name }}.') >>> c = Context({'name': 'yewenhao'}) >>> t.render(c) 结果:My name is yewenhao #同一个模板创建了一次,我们可以调用多次 # 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}))
2 万能的句点号
def index(wy): s1 = [123,345,567] s2 = {"username":"叶文浩"} return render(wy,"login.html",locals()) #HTML页面 #在列表中 <h2>{{s1.0}}</h2> #在字典中 <h2>{{s2.username}}</h2> 结果 123 叶文浩
#同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有 #year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性: >>> from django.template import Template, Context >>> import datetime >>> d = datetime.date(1993, 5, 2) >>> d.year 1993 >>> d.month 5 >>> d.day 2
def attr_test1(eq): class Person: def __init__(self,name,age): self.name = name self.age = age s1 = Person("yewenhao",18) obj = Person("lijian",26) s2 = [123,345,567,789] return render(eq,"attr_test1.html",locals()) #html页面 <h1>{{s1}}</h1> <h1>{{s1.name}}</h1> <h1>{{s1.age}}</h1> #结果 <blog.views.attr_test1.<locals>.Person object at 0x0000000004173BA8> yewenhao 18
# 点语法也可以用来引用对象的方法。 例如,每个 Python 字符串都有 upper() 和isdigit() # 方法,你在模板中可以使用同样的句点语法来调用它们: >>> from django.template import Template, Context >>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}') >>> t.render(Context({'var': 'hello'})) 'hello -- HELLO -- False' >>> t.render(Context({'var': '123'})) '123 -- 123 -- True'
3 变量的过滤器(filter)的使用
# 1 add : 给变量加上相应的值 # # 2 addslashes : 给变量中的引号前加上斜线 # # 3 capfirst : 首字母大写 # # 4 cut : 从字符串中移除指定的字符 # # 5 date : 格式化日期字符串 # # 6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值 # # 7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值 #实例: #value1="aBcDe" {{ value1|upper }}<br> #value2=5 {{ value2|add:3 }}<br> #value3='he llo wo r ld' {{ value3|cut:' ' }}<br> #import datetime #value4=datetime.datetime.now() {{ value4|date:'Y-m-d' }}<br> #value5=[] {{ value5|default:'空的' }}<br> #value6='<a href="#">跳转</a>' {{ value6 }} {% autoescape off %} {{ value6 }} {% endautoescape %} {{ value6|safe }}<br> {{ value6|striptags }} #value7='1234' {{ value7|filesizeformat }}<br> {{ value7|first }}<br> {{ value7|length }}<br> {{ value7|slice:":-1" }}<br> #value8='http://www.baidu.com/?a=1&b=3' {{ value8|urlencode }}<br> value9='hello I am yuan'
4 {% if %} 的使用
{% if True %} <p>hello world</p> {% elif obj %} <P>hello yewenhao</p> {% endif %} 结果: if 条件为true,则打印hello world(这里不管elif的条件是真是假都不会打印下面的内容了) if 条件为false,如果elif的条件为false则都不打印;elif的条件为true只打印hello yewenhao
5 {% for %} 的使用
def attr_test1(eq): s2 = [123,345,567,789] s3 = ["跑得快","别墨迹"] return render(eq,"attr_test1.html",locals()) #html代码 {% for i in s2%} <p>{{forloop.counter}}:{{i}}</p> {% endfor %} 结果: 1:123 2:345 3:567 4:789 #在标签里添加reversed来反序循环列表: {% for i in s2 reversed %} <p>{{forloop.counter}}:{{i}}</p> {% endfor %} 结果: 1:789 2:567 3:345 4:123 #{% for %}标签可以嵌套: {% for i in s2 %} <p>{{i}}</p> <p>{%for y in s3 %}</p> <li>{{y}}</li> {% endfor %} 结果: 123 跑得快 别墨迹 345 跑得快 别墨迹 567 跑得快 别墨迹 789 跑得快 别墨迹
6 {% csrf_token %} :csrf_token标签
用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效
其实,这里会生成一个input标签,和其他表单标签一起提交给后台的
7 {% url %} :引用路由配置的地址
<form action="{% url "bieming"%}" > <input type="text"> <input type="submit"value="提交"> {%csrf_token%} </form>
8 {% with %}:用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %}
{{ total }}
{% endwith %}
9 {% verbatim %}: 禁止render
verbatim中间的部分不会去解析
{% verbatim %}
{{ hello }} {% endverbatim %}