模板语言
什么是模板语言?
html+逻辑控制语句
Template和Context
在终端:python manage.py shell 进入django 环境
>>> from django.template import Context,Template
>>> t = Template('My name is {
{name}}')
>>> c= Context({'name':'kkk'})
>>> t.render(c)
'My name is kkk'
简而言之就是{ { 变量 }} 嵌套在html中 变量可以直接从后端获取
深度变量的查找–> 万能的句点号.
最好是用几个例子来说明一下。
# 首先,句点可用于访问列表索引,例如:
>>> from django.template import Template, Context
>>> t = Template('Item 2 is {
{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
'Item 2 is carrots.'
#假设你要向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:
>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{
{ person.name }} is {
{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
'Sally is 43 years old.'
#同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有
#year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:
>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {
{ date.month }} and the year is {
{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
'The month is 5 and the year is 1993.'
# 这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适
# 用于任意的对象。
>>> from django.template import Template, Context
>>> class Person(object):
... def __init__(self, first_name, last_name):
... self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {
{ person.first_name }} {
{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
'Hello, John Smith.'
# 点语法也可以用来引用对象的方法。 例如,每个 Python 字符串都有 upper() 和 isdigit()
# 方法,你在模板中可以使用同样的句点语法来调用它们:
>>> from django.template import Template, Context
>>> t = Template('{
{ var }} -- {
{ var.upper }} -- {
{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
'123 -- 123 -- True'
# 注意这里调用方法时并* 没有* 使用圆括号 而且也无法给该方法传递参数;你只能调用不需参数的
# 方法。
if
if只能判断true 或 false 的值 不能进行复杂判断
{% if 1 %}
{% elif False %}
{% endif %}
for
{% for i in obj%}
#这里拿到的是值不是索引
{% endfor %}
li=[1,2,3]
{% for foo in li %}
{
{ forloop.counter }}
{% endfor %}
{% for foo in li %}
{
{ forloop.counter0 }}
{% endfor %}
{% for foo in li %}
{
{ forloop.revcounter }}
{% endfor %}
-----------------------------------------------
1 2 3
0 1 2
3 2 1
filter & simple_tag
filter 过滤器
str='helloWord'
{
{ str | upper }} 大写
{
{ str | lower }} 小写
{
{ str | first | upper }} 第一个字符大写
{
{ str | capfirst }} 首字母大写
-----------------------------------------
HELLOWORD
helloword
H
HelloWord
add:给变量加上相应的值
addslashes:给变量中的引号前加上斜线
copfirst:首字母大写
cut:从字符串中移除指定的字符
date:格式化日期字符串
defoult:如果值是False就替换成设置的默认值,否则用本来的值
add=5
{
{obj|add:5}}
value2='hel l o wor ld'
{
{value2|cut:' '}}
value3=datetime.datetime.now()
{
{value3|date:'y-m-d'}}
value=[]
{
{ value|default:'空的' }}
-----------------------------------
11
hellowrod
2017-10-18
空的
s1 = "OK"
{% autoescape off %}
{
{ s1 }}
{% endautoescape %}
直接将标签进行渲染
{
{s1|safe}}
作用同上
自定义filter
在文件夹下创建任意名称py文件
aaa.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def add_nub(a1, a2):
return a1 + a2
在settings文件中注册app
使用{ {参数1|函数名:参数2}}
demo.html
{% load aaa %}
Title
{ { ‘asd’|add_str:’zxc’ }}
自定义simple_tag
在文件夹下创建任意名称py文件
aaa.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def add_nub(a1, a2):
return a1 + a2
在settings文件中注册app
使用{% 函数名 参数1 参数2 ……%}
demo.html
{% load aaa %}
Title
{% add_nub 1 2 %}
filter 与 simple_tag 的比较:
filter 和 if 语句在模板语言中的应用
filter_demo.html
{% load my_tag %}
Title
{% if n1 and n2 %}
{% if n1|add_num:n2 > 100 %}
{
{ n1 }}+{
{ n2 }} = {
{ n1|add_num:n2 }} 大于100
{% elif n1|add_num:n2 == 100 %}
{
{ n1 }}+{
{ n2 }} = {
{ n1|add_num:n2 }}等于100
{% else%}
{
{ n1 }}+{
{ n2 }} = {
{ n1|add_num:n2 }}小于100
{% endif %}
{% endif %}
my_tag.py
from django import template
register = template.Library()
@register.filter
def add_num(nub1, nub2):
return int(nub1) + int(nub2)
view
def filter_demo(request):
if request.method == 'POST':
n1 = request.POST.get('n1',None)
n2 = request.POST.get('n2',None)
print(n1,n2)
return render(request, 'filter_demo.html', locals())
elif request.method == 'GET':
return render(request, 'filter_demo.html')
模板的继承
base.html
Title
{% block content %}
What Happtend
{% endblock %}
ordered.html
{% extends 'base.html' %}
{% block content %}
{
{ block.super }}
订单
{% endblock %}
shopping_car.html
{% extends 'base.html'%}
{% block content %}
购物车
{% endblock %}
敲黑板