Django学习笔记-3-模板
来源:互联网 发布:阿里云幕布如何申请 编辑:程序博客网 时间:2024/05/18 00:48
前面的代码例子中还使用了HTML硬编码,现在要将HTML部分和代码分离,因此需要使用模板。
在newtest\newtest下面创建python文件HTML_template.py(当然文件也不一定非要在这个地方)
from django import template
t = template.Template("My name is {{ name }}.")
c = template.Context({"name" : "Adrian"})
print t.render(c)
这个时候如果直接运行HTML_template.py,会提示如下错误:
DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
settings.configure()
from django import template
from django.conf import settings
settings.configure()
t = template.Template("My name is {{ name }}.")
c = template.Context({"name" : "Adrian"})
print t.render(c)
2. windows系统中设置2个环境变量:
形式:
{% if %}
{% else %}
{% endif %}
{% if %} 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的。系统不支持用圆括号来组合比较操作。 如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果。 或者,仅仅用嵌套的{% if %}标签替换。
没有 {% elif %} 标签, 请使用嵌套的`` {% if %}`` 标签来达成同样的效果。并且一定要用 {% endif %} 关闭每一个 {% if %} 标签。
形式:
{% for %}
{% empty %} # 可选分句
{% endfor %}
Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。
形式:
{% ifequal/ifnotequal %}
{% else %} # 可选分句
{% endifequal/endifnotequal %}
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数。其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在 {% ifequal %} 中。如果需要判断变量是真还是假,得使用 {% if %} 来替代 {% ifequal %} 。
形式:
单行注释:
{# <your comment> #}
多行注释:
{% comment %}
<your comment>
{% endcomment %}
Note:
模板中的"name"和context中的"name"要一样,也就是说context中字典的key要和模板中的变量名一致。默认情况下,如果模板中的变量在context中不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败。
django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATE_DEBUG, but settings are not configured. You must either define the environment variable
这是因为没有设置DJANGO_SETTINGS_MODULE环境变量。当然如果你通过python manage.py shell进入交互解释器输入以上代码是不会有问题的。但是如果你想执行脚本文件的话,就一定要设置DJANGO_SETTINGS_MODULE环境变量。我比较喜欢2种方式:
1. 在代码中添加以下2行:
from django.conf import settings
新建系统环境变量DJANGO_SETTINGS_MODULE,其值为<project>.settings,我这里是newtest.settings;
新建系统环境变量PYTHONPATH,其值为D:\Program Files\Python27\DLLs;D:\Program Files\Django-1.5.1\mao_test\newtest
重新开启命令行,运行.py文件就OK了。
使用django模板系统的基本规则:创建你自己需要的模板,创建Template对象,创建Context对象,调用render()方法。其中Context构造的参数是字典数据类型;render()方法返回渲染后的模板的方法,它会替换模板变量为真实的值和执行块标签,并且返回的是一个Unicode对象,不是普通的python字符串。理论上返回值最前面会有一个u,但是实际上我的返回值是没有的,不知道是啥原因。下来再查查。
基本的模板标签和过滤器
1. if/else
形式:
{% if %}
{% else %}
{% endif %}
{% if %} 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的。系统不支持用圆括号来组合比较操作。如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果。 或者,仅仅用嵌套的{% if %}标签替换。
没有 {% elif %} 标签, 请使用嵌套的`` {% if%}`` 标签来达成同样的效果。并且一定要用 {% endif %} 关闭每一个 {% if %} 标签。
2. for
形式:
{% for %}
{% empty %} # 可选分句
{% endfor %}
Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。
3. ifequal/ifnotequal
形式:
{%ifequal/ifnotequal %}
{% else %} #可选分句
{%endifequal/endifnotequal %}
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数。其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在 {% ifequal %} 中。如果需要判断变量是真还是假,得使用 {% if %} 来替代 {% ifequal %} 。
4. 注释
形式:
单行注释:
{# <yourcomment> #}
多行注释:
{% comment %}
<yourcomment>
{% endcomment %}
过滤器
过滤器使用管道符,如:{{ name | lower }},即变量{{ name }}由过滤器lower处理后的结果,转换文本为小写。过滤器是可以被套接的,即过滤器管道的输出可以作为下一个管道的输入,如此下去。
视图中使用模板
通常想到的对模板的使用是创建一个template.html文件,然后在脚本中对template文件进行open,read其内容,但是这样仍然会在python文件中对模板进行硬编码,而且如果template不止一个,会有越来越多的open,read,增加了繁琐的程度。因此为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板。要使用此模板加载API,首先必须将模板的保存位置告诉框架,设置的保存文件就是setting.py。在里面找到TEMPLATE_DIRS,把需要的模板路径添加到这个元组里面。如:
TEMPLATE_DIRS =(
'C:/www/django/templates', # 这个是template所在的目录,要用到的template文件在此目录下。且template文件的后缀没有规定,即可以为.html或.txt等等,甚至没有后缀。
)
注意,后面的逗号是必不可少的。以此消除圆括号表达式之间的歧义。
render_to_response()
这个函数一次性完成加载template,渲染它,然后将此作为HttpResponse返回。如:
from django.shortcutsimport render_to_responseimport datetime defcurrent_datetime(request): now = datetime.datetime.now() returnrender_to_response('current_datetime.html', {'current_date': now})
render_to_response()函数的第一个参数必须是要使用的模板的名称。如果要给定第二个参数,那么该参数必须是为该模板创建 Context 时所使用的字典。 如果不提供第二个参数,render_to_response() 使用一个空字典。模板继承
本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。
基础框架模板如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><html lang="en"><head> <title>{% block title %}{% endblock %}</title></head><body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %}</body></html>子模板current_datatime.html:
{% extends "base.html" %}{% block title %}The current time{% endblock %}{% block content %}<p>It is now {{ current_date }}.</p>{% endblock %}对于子模板来说,必须保证{% extends %}为第一个模板标记,用于继承基础框架模板。{% block %}标签用于告诉模板引擎,子模板可以重载这些部分。重载的时候会对应block后面跟的名字。即子模板中的{% block title%}会重载父模板中的{% block title%},子模板中的{% block content%}会重载父模板中的{% block content%}。
Note:不允许在同一个模板中定义多个同名的block。
- Django学习笔记-3-模板
- Django的学习笔记(二)(Django模板)
- 【django 学习笔记】03-模板
- Django 学习笔记2 模板
- django学习笔记(模板)
- django学习笔记- 模板篇
- 【django 学习笔记】08-模板高级进阶
- Django学习笔记(第四节)模板
- Django学习笔记9-使用模板
- Django学习笔记(4):Django模板系统(上)
- Django学习笔记(5):Django模板系统(下)
- Django 学习笔记(3)
- Django笔记 模板 标签
- Django学习笔记3 Django模型
- Django学习3-模板中使用变量
- Diango学习3:Django模板应用实例
- django 学习 (二) 模板
- Django学习____模板
- Map
- fedora
- android怎样调用@hide和internal API
- 備份Thunderbird郵件和設置
- Win7下cocos2d-x 2.1.4安卓开发环境搭建
- Django学习笔记-3-模板
- 3G开发之android
- Adb connection Error:远程主机强迫关闭了一个现有的连接
- 自考工作分析之工作分析的基础方法
- php读取mysql数据库的内容后,中文变成问号
- URL中原来的加号变成了空格(Server.UrlEncode无效)解决方案
- hibernate 中createQuery与createSQLQuery
- 进程地址空间的布局以及进程堆栈帧的结构
- UVA 12264 二分+最大流 基础题