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。

 


原创粉丝点击