zoukankan      html  css  js  c++  java
  • Django系列教程:四、模板

    注明:python版本为3.3.1、Django版本为1.5.1,操作系统为Windows7,其他版本有一些不同的地方读者可以自行探讨。

    在上一章你可能已经发现了这样的问题,就是在视图返回文本的时候,HTML代码被硬编码在了python的代码中。如%s等等。像这样写往往使得程序更加复杂,一旦修改起来又显得十分的麻烦,而且HTML代码程序员不见得会python代码,现在的开发一般都会使得HTML前台页面和Python后台分离,也就是前台只负责显示页面,后台只负责处理数据和其他操作。因此,模板显得尤为重要。

    那么,什么是模板呢?

    模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。 模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。下面我们从一个简单的例子来学习下什么是模板。(这个例子源自DjangoBook2)

     1 <html>
     2 <head><title>Ordering notice</title></head>
     3 <body>
     4 <h1>Ordering notice</h1>
     5 <p>Dear {{ person_name }},</p>
     6 <p>Thanks for placing an order from {{ company }}. It's scheduled to
     7 ship on {{ ship_date|date:"F j, Y" }}.</p>
     8 <p>Here are the items you've ordered:</p>
     9 <ul>
    10 {% for item in item_list %}
    11     <li>{{ item }}</li>
    12 {% endfor %}
    13 </ul>
    14 {% if ordered_warranty %}
    15     <p>Your warranty information will be included in the packaging.</p>
    16 {% else %}
    17     <p>You didn't order a warranty, so you're on your own when
    18     the products inevitably stop working.</p>
    19 {% endif %}
    20 <p>Sincerely,<br />{{ company }}</p>
    21 </body>
    22 </html>

    如上所示用{{...}}或者{%...%}来替代python代码的方式就是模板,像第一个{{person_name}}其实就是一个变量,而{%for....%}或者{% if ...%}等就是循环。先不去深究上面的代码的意思,我们下面一步一步来学习怎么使用它。

    >>> from django import template
    >>> t = template.Template('My name is {{ name }}.')
    >>> c = template.Context({'name': 'Adrian'})
    >>> print(t.render(c))
    My name is Adrian.
    >>> c = template.Context({'name': 'Fred'})
    >>> print(t.render(c))
    My name is Fred.

    当你看到上面的代码时你可能会急不可耐的去尝试,结果在第二行却出现了错误。一般来说唯一可能出现的错误就是:'DJANGO_SETTINGS_MODULE'error,这是因为Django搜索DJANGO_SETTINGS_MODULE环境变量时,它被设置在settings.py中,而直接启动python shell就会导致它不知道用哪个配置文件。例如,假设mysite在你的Python搜索路径中,那么DJANGO_SETTINGS_MODULE应该被设置为:’mysite.settings’。所以为了免去设置环境变量的麻烦,我们应该这样启动python shell。

    python manage.py shell

    这样可以免去你大费周章地去配置那些你不熟悉的环境变量。

    下面我们来分析下那段代码。

    >>> from django import template  #从django中导入template对象 
    >>> t = template.Template('My name is {{ name }}.')  #使用template对象的Template()方法
    >>> c = template.Context({'name': 'Adrian'})  #使用template对象的Context()函数给赋值,比如name的值就是Adrian,Context()的()里面是一个字典
    >>> print(t.render(c))   #渲染模板,也就是讲Context赋值后的name的值Adrian替换上面Template()中的{{name}}并输出
    My name is Adrian.
    >>> c = template.Context({'name': 'Fred'})
    >>> print(t.render(c))
    My name is Fred.

    从上面的例子可以看出,使用模板的三步。一、调用Template函数;二、调用Context函数;三、调用render函数。就这么简单。

    下面我们再通过几个代码来说说Context()函数。

    代码段1:

    >>> from django.template import Template,Context
    >>> t=Template('hello,{{name}}')
    >>> for name in ('A','B','C'):
    ...     print(t.render(Context({'name':name})))
    ...
    hello,A
    hello,B
    hello,C

    代码段2:

    >>> from django.template import Template,Context
    >>> person={'name':'Thunder','age':'108'}
    >>> t=Template('{{person.name}} is {{person.age}} years old!')
    >>> c=Context({'person':person})#后面的这个person是一个字典
    >>> t.render(c)
    'Thunder is 108 years old!'


    代码段3:

    >>> from django.template import Template,Context
    >>> t=Template('Item 2 is {{items.2}}')#items.2的意思是调用items列表的第3个元素,因为列表的索引是从0开始的
    >>> c=Context({'items':['Apple','Banana','Orange']})
    >>> t.render(c)
    'Item 2 is Orange'

    注意:上面的items.2不能是items.-1或者其他什么负数索引。

    好好观察上面三段代码,是不是就举一反三了呢?另外默认情况下,如果一个变量不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败。

    至于标签和过滤器以及模板在视图中的应用我们将这这一章的续集来讲述。今天就到这吧。

    本人既是python的初学者也是Django的初学者,写这一系列教程的目的就是为了加深自己的理解,希望大家多多包涵和指教,有什么问题请留言,谢谢。

    鹜落霜洲,雁横烟渚,分明画出秋色。暮雨乍歇,小楫夜泊,宿苇村山驿。何人月下临风处,起一声羌笛。离愁万绪,闲岸草、切切蛩吟似织。 为忆芳容别后,水遥山远,何计凭鳞翼。想绣阁深沉,争知憔悴损,天涯行客。楚峡云归,高阳人散,寂寞狂踪迹。望京国。空目断、远峰凝碧。
  • 相关阅读:
    Windows快捷键
    visual studio code颜色主题切换
    visual studio code中文语言包安装
    顶点缓存与索引缓存
    程序结构(2)
    ansible常用模块
    ansible常用模块
    ubuntu实用技巧
    ubuntu实用技巧
    Sqoop导出MySQL数据
  • 原文地址:https://www.cnblogs.com/thunderest/p/3075093.html
Copyright © 2011-2022 走看看