Django学习笔记(2)

时间已过久远,重新回顾了下。

从第四章开始。

模板:
    变量:{{变量名}}
    模板标签:{%逻辑语句(if, for 等等)%}
    过滤器:{{ship_date|date:"F j, Y"}} 类似于Unix

>>> from django.template import Template, Context
>>> t = Template('Hello, {{ name }}')
>>> print t.render(Context({'name': 'John'}))
Hello, John
>>> print t.render(Context({'name': 'Julie'}))
Hello, Julie
>>> print t.render(Context({'name': 'Pat'}))
Hello, Pat
以上例子可以概括模板的使用。Template对象初始化模板,render渲染。一个模板可以对应多个上下文。


复杂对象按照如下顺序查找:

  • 字典类型查找 (比如 foo["bar"] )

  • 属性查找 (比如 foo.bar )

  • 方法调用 (比如 foo.bar() )

  • 列表类型索引查找 (比如 foo[bar] )

模板里也可以调用方法,为了防止误调,需要给这个方法加 alters_data=True 既可
def delete(self):
    # Delete the account
delete.alters_data = True
Context对象修改和字典是一样的:
>>> from django.template import Context
>>> c = Context({"foo": "bar"})
>>> c['foo']
'bar'
>>> del c['foo']
>>> c['foo']
Traceback (most recent call last):
  ...
KeyError: 'foo'
>>> c['newvariable'] = 'hello'
>>> c['newvariable']
'hello'

标签和过滤器:

1、逻辑表达式

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% else %}
    <p>Get back to work.</p>
{% endif %}
其中else是可选的。
{% if %}  标签不允许在同一个标签中同时使用 and  和 or。


2、循环

(1)正向迭代(empty可选,表示列表为空要做的事情)

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}


(2)反向迭代

{% for athlete in athlete_list reversed %}
...
{% endfor %}

forloop.counter 从1开始计数器
forloop.counter0 从0开始计数器
forloop.revcounter 剩余循环数
forloop.revcounter0 剩余数-1
forloop.first 是否为循环的第一个,boolean值
forloop.last 是否为循环最后一个,boolean值
forloop.parentloop 上一层循环的对象引用

如果自己定义的变量和forloop里的重复,会移到forloop.parentloop

3、比较两个值(相等:ifequal,不等:ifnotequal)


{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}


else可选,字典类型、列表类型、布尔类型不能使用。

4、注释

{# This is a comment #}
{% comment %}
This is a
multi-line comment.
{% endcomment %}
第一个是单行,第二个是多行。


在Views中使用模板

setting.py中设置模板路径

TEMPLATE_DIRS = (
    '/home/django/mysite/templates',
)
import os.path

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
前者为绝对路径,后者为相对路径。
`` os.path.dirname(__file__)`` 将会获取自身所在的文件,即settings.py  所在的目录。


切换到视图,代码:

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)
以上代码的简化版本:


from django.shortcuts import render_to_response
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})
locals()可以返 返回的字典对所有局部变量的名称与值进行映射,少写些代码。


模板目录的子目录:

t = get_template('dateapp/current_datetime.html')

包含其他页面:


{% include 'nav.html' %} {% include 'includes/nav.html' %} {% include template_name %}
第一行包含当前目录文件,第二行为子目录,第三行为变量值(template_name)


模板继承

base.html:


<!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_data.html:
{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
{% block 块名%}块的内容{% endblock %}

第二部分就到这里,模板的细节还是不少的~~

你可能感兴趣的:(python,django,template)