现在的位置: 首页 > 综合 > 正文

django-笔记

2018年04月30日 ⁄ 综合 ⁄ 共 5760字 ⁄ 字号 评论关闭
1、django模板中 调用 t=Template('Item 2 is {{item.2}}.')报错
 解决方法:
   >>> from django.template import Template,Context
   >>> from django.conf import settings
   >>> settings.configure()
   >>> t=Template('Item 2 is {{item.2}}.')
2、注意,调用方法时你不能加括号,你也不能给方法传递参数
你只能调用没有参数的方法,后面我们会解释这些

3、总结一下,当模板系统遇到变量名里有小数点时会按以下顺序查找:
1,字典查找,如foo["bar"]
2,属性查找,如foo.bar
3,方法调用,如foo.bar()
3,列表的索引查找,如foo[bar]
小数点可以多级纵深查询,例如{{ person.name.upper }}表示字典查询person['name']然后调用upper()方法

4、根据例子讲解 符号作用   
   1. <html>  
   2. <head><title>Ordering notice</title></head>  
   3. <body>  
   4. <p>Dear {{ person_name }},</p>  
   5. <p>Thanks for placing an order from {{ company }}. It's scheduled to  
   6. ship on {{ ship_date|date:"F j, Y" }}.</p>  
   7. <p>Here are the items you've ordered:</p>  
   8. <ul>  
   9. {% for item in item_list %}  
  10. <li>{{ item }}</li>  
  11. {% endfor %}  
  12. </ul>  
  13. {% if ordered_warranty %}  
  14. <p>Your warranty information will be included in the packaging.</p>  
  15. {% endif %}  
  16. <p>Sincerely,<br />{{ company }}</p>  
  17. </body>  
  18. </html>  

这个模板本质上是HTML,但是夹杂了一些变量和模板标签:
1,用{{}}包围的是变量,如{{person_name}},这表示把给定变量的值插入,如何指定这些变量的值我们即将说明
2,用{%%}包围的是块标签,如{%if ordered_warranty%}
块标签的含义很丰富,它告诉模板系统做一些事情
在这个例子模板中包含两个块标签:for标签表现为一个简单的循环结构,让你按顺序遍历每条数据
if标签则表现为逻辑的if语句
在这里,上面的标签检查ordered_warranty变量的值是否为True
如果是True,模板系统会显示{%if ordered_warranty%}和{%endif%}之间的内容
否则,模板系统不会显示这些内容
模板系统也支持{%else%}等其它逻辑语句
3,上面还有一个过滤器的例子,过滤器是改变变量显示的方式
上面的例子中{{ship_date|date:"F j, Y"}}把ship_date变量传递给过滤器
并给date过滤器传递了一个参数“F j, Y”,date过滤器以给定参数的形式格式化日期
类似于Unix,过滤器使用管道字符“|”
Django模板支持多种内建的块标签,并且你可以写你自己的标签

5、使用模板系统
在Python代码中使用模板系统,请按照下面的步骤:
1,用模板代码创建一个Template对象
Django也提供指定模板文件路径的方式创建Template对象
2,使用一些给定变量context调用Template对象的render()方法
这将返回一个完全渲染的模板,它是一个string,其中所有的变量和块标签都会根据context得到值

6、系统触发TemplateSyntaxError异常可能出于以下情况:
   1,不合法的块标签
   2,合法块标签接受不合法的参数
   3,不合法的过滤器
   4,合法过滤器接受不合法的参数
   5,不合法的模板语法
   6,块标签没关

7、关于方法的调用
    方法调用要比其他的查询稍微复杂一点,下面是需要记住的几点:
    1,在方法查询的时候,如果一个方法触发了异常,这个异常会传递从而导致渲染失
    败,但是如果异常有一个值为True的silent_variable_failure属性,这个变量会渲染成空    string:
    2,方法调用仅仅在它没有参数时起作用,否则系统将继续查找下一个类型(列表索引查询)
    3,显然一些方法有副作用,让系统访问它们是很愚蠢的,而且很可能会造成安全性问
    题。
    例如你有一个BankAccount对象,该对象有一个delete()方法,模板系统不应该允许做下面的    事情
    I will now delete this valuable data. {{ account.delete }}
    为了防止这种状况,可以在方法里设置一个方法属性alters_data
    如果设置了alters_data=True的话模板系统就不会执行这个方法:

8、标签和过滤器

if/else
{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值
系统则会显示{% if %}和{% endif %}间的所有内容

% if %}标签接受and,or或者not来测试多个变量值或者否定一个给定的变量

% if %}标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的:

如果你想结合and和or来做高级逻辑,只需使用嵌套的{% if %}标签即可:

多次使用同一个逻辑符号是合法的:

没有{% elif %}标签,使用嵌套的{% if %}标签可以做到同样的事情:

确认使用{% endif %}来关闭{% if %}标签,否则Django触发TemplateSyntaxError

for

{% for %}标签允许你按顺序遍历一个序列中的各个元素
Python的for语句语法为for X in Y,X是用来遍历Y的变量
每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容

   1. <ul>  
   2. {% for athlete in athlete_list %}  
   3.     <li>{{ athlete.name }}</li>  
   4. {% endfor %}  
   5. </ul>  

在标签里添加reversed来反序循环列表:
Java代码 复制代码

   1. {% for athlete in athlete_list reversed %}  
   2. ...  
   3. {% endfor %}  
   4. {% for %}标签可以嵌套:  
   5. {% for country in countries %}  
   6.     <h1>{{ country.name }}</h1>  
   7.     <ul>  
   8.     {% for city in country.city_list %}  
   9.         <li>{{ city }}</li>  
  10.     {% endfor %}  
  11.     </ul>  
  12. {% endfor %}  

系统不支持中断循环,如果你想这样,你可以改变你想遍历的变量来使得变量只包含你想遍历的值
类似的,系统也不支持continue语句,本章后面的“哲学和限制”会解释设计的原则
{% for %}标签内置了一个forloop模板变量,这个变量含有一些属性可以提供给你一些关于循环的信息
1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1,例如:
Java代码 复制代码

   1. {% for item in todo_list %}  
   2.     <p>{{ forloop.counter }}: {{ item }}</p>  
   3. {% endfor %}  

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

2,forloop.counter0类似于forloop.counter,但它是从0开始计数,第一次循环设为0
3,forloop.revcounter表示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1
4,forloop.revcounter0类似于forloop.revcounter,但它是表示的数量少一个,即最后一次循环时设为0
5,forloop.first当第一次循环时值为True,在特别情况下很有用:
Java代码 复制代码

   1. {% for object in objects %}  
   2.     {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}  
   3.     {{ object }}  
   4.     </li>  
   5. {% endfor %}   

6,forloop.last当最后一次循环时值为True
Java代码 复制代码

   1. {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}  

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

7,forloop.parentloop在嵌套循环中表示父循环的forloop:
Java代码 复制代码

   1. {% for country in countries %}  
   2.     <table>  
   3.     {% for city in country.city_list %}  
   4.         <tr>  
   5.             <td>Country #{{ forloop.parentloop.counter }} </td>  
   6.             <td>City #{{ forloop.counter }}</td>  
   7.             <td>{{ city }}</td>  
   8.         </tr>  
   9.     {% endfor %}  
  10.     </table>  
  11. {% endfor %}  

{% for country in countries %}
    <table>
    {% for city in country.city_list %}
        <tr>
            <td>Country #{{ forloop.parentloop.counter }} </td>
            <td>City #{{ forloop.counter }}</td>
            <td>{{ city }}</td>
        </tr>
    {% endfor %}
    </table>
{% endfor %}

富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了
如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它
Django会在for标签的块中覆盖你定义的forloop变量的值
在其他非循环的地方,你的forloop变量仍然可用
我们建议模板变量不要使用forloop,如果你需要这样做来访问你自定义的forloop,你可以使用forloop.parentloop

关于模板:

它是这样工作的:
1,当你载入模板current_datetime.html,模板引擎发现{% extends %}标签,注意到这是一个子模板
模板引擎马上载入父模板base.html
2,模板引擎在base.html里发现了3个{% block %}标签,就用子模板的内容替换了这些块
于是我们定义的{% block title %}和{% block content %}被使用
注意,既然子模板没有定义footer块,那么模板系统直接使用父模板的值
父模板里{% block %}标签的内容一直可以作为后援方案
你可以使用任意等级的继承,使用继承的常用方式是按以下三个步骤:
1,创建base.html模板来掌控你的网站的整体外观,它的内容很少改变
2,为你的网站创建base_SECTION.html模板,例如,base_photos.html,base_forum.html
这些模板继承base.html并且包括部分专有的风格和设计
3,为每个类别的页面创建单独的模板,例如论坛页面护着照片图库页面
这些模板继承相应的部分模板
这个方法最大化了代码重用并且很容易向公用区域添加东西,例如部分专有的导航
下面是一些关于模板继承的小提示:
1,如果在模板里使用{% extends %}的话,这个标签必须在所有模板标签的最前面,否则模板继承不工作
2,通常基本模板里的{% block %}越多越好,子模板不必定义所有的父block,钩子越多越好
3,如果你在很多模板里复制代码,很可能你应该把这些代码移动到父模板里
4,如果你需要得到父模板的块内容,{{ block.super }}变量可以帮你完成工作
当你需要给父块添加内容而不是取代它的时候这就很有用
5,不能在同一模板里定义多个同名的{% block %},因为块标签同时在两个地方工作,不仅仅
在子模板中,而且在父模板中也填充内容,如果子模板有两个同名的标签,父模板将不能决定
使用哪个块内容来使用
6,你给{% extends %}传递的模板名同样会被get_template()使用,所以会加上TEMPLATE_DIRS设置
7,大部分情况下,{% extends %}的参数是string,但是也可以是变量,如果知道运行时才知道
父模板的名字,这可以帮助你做一些很cool的动态内容

{% for item in {{MUSICIANS}}%}
<tr>
  <td>{{item['name']}}</td>
  <td>{{item['genre']}}</td>
</tr>
{% endfor %}

抱歉!评论已关闭.