首页 > 技术文章 > 模板语言(一)

yehost 2019-01-08 22:52 原文

一模版的组成

组成: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}))
View Code

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'
引用对象的方法

 

变量的过滤器(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'
View Code

 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
View Code

{% 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
跑得快
别墨迹
        
View Code

 

{% csrf_token %} :csrf_token标签

 用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效

 其实,这里会生成一个input标签,和其他表单标签一起提交给后台的

{% url %} :引用路由配置的地址

 

<form action="{% url "bieming"%}" >
          <input type="text">
          <input type="submit"value="提交">
          {%csrf_token%}
</form>

 

{% with %}用更简单的变量名替代复杂的变量名

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} 
{{ total }}
{% endwith %}

9 {% verbatim %}: 禁止render

 verbatim中间的部分不会去解析

 

{% verbatim %}    
{{ hello }}
{% endverbatim %}

 

 

 

 

 

推荐阅读