一般情况下后台提取到数据时候只会以某种数据类型的方式交给HTML页面,如果所有的都编程单个的变量,会严重影响开发效率,这就要求模板拥有基本的逻辑处理能力,故而诞生了模板语言
配置静态文件
如果模板设计需要静态文件的话,必须要在开头添加一下语句
{% load staticfiles %}
然后配置jquery、Bootscript等等
变量
变量的值是来自contex中的输出, t,context对象需要在视图函数中指定,这类似于字典对象的keys到values的映射关系。
context应该这样在views里面定义
def index(request):
book_list = Books.objects.all()
return render(request, 'index1.html', locals())
这样 book_list就可以直接在模板中使用
变量是被 {{和 }}括起来的部分,例如:
My first name is {{ first_name }}. My last name is {{ last_name }}.
如果使用一个 context包含 {'first_name': 'John', 'last_name': 'Doe'}, 这个模板渲染后的情况将是:
My first name is John. My last name is Doe.
深度查询
字典查询,属性查询和列表索引查找都是通过一个点符号来实现:
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
如果一个变量被解析为一个可调用的,模板系统会调用它不带任何参数,并使用调用它的结果来代替这个可调用对象本身。
过滤器
过滤器会更改变量或标签参数的值。
看上去像这样:
{{ django|title }}
例如在 {'django': 'the web framework for perfectionists with deadlines'}这个context中,django变量的值都是小写,经title过滤器渲染后则变成:
The Web Framework For Perfectionists With Deadlines
有些过滤器看起来更像参数:
{{ my_date|date:"Y-m-d" }}
还有很多过滤器
add 把add后的参数加给value
{{ first|add:second }}
first是 [1, 2, 3],second是 [4, 5, 6], 将会输出 [1, 2, 3, 4, 5, 6].
addslashes :在引号前面加上斜杠
{{ value|addslashes }}
如果value是 "I'm using Django", 输出将变成 "I'm using Django".
capfirst:大写变量的第一个字母
{{ value|capfirst }}
如果 value 是 "django", 输出将变成 "Django".
center:使value在给定的宽度范围内居中
"{{ value|center:"15" }}"
如果value是"Django",输出将是“ Django t7>。
cut:移除value中所有的与给出的变量相同的字符串
{{ value|cut:" " }}
如果value为“String with spaces”,输出将为"Stringwithspaces"。
还有safe, default, truncateword等等
自定义过滤器
自定义过滤器其实和自定义标签是很相似的,其目的都是为了使显示达到自己想要的内容或者格式
创建 assets.py,和二中tag在同一目录下,其作用是在全局变量的变动下加载不同的css
首先在settings.py文件中 设置一个变量 IS_DEVELOP=True,作用是当问true时加载测试的css,False时加载正常用的css
asserts.py:
from django import template
from my_blog.settings import IS_DEVELOP
register = template.Library()
@register.filter
def assets(value):
if IS_DEVELOP:
return "/static/css/test.css"
return "/static/css/base_css/base_logre.css"
在base.html中做如下修改
{% load assets %}
标签
标签在渲染的过程中提供任意的逻辑。
这个定义是刻意模糊的。例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。
Tags是由{%和 %} 来定义的,例如:
{% csrf_token %}
大部分标签都接受参数
{%< cycle 'odd' 'even' %}
部分标签要求使用起始和闭合标签:
{%< if user.is_authenticated %}Hello, {{ user.username }}.{%< endif %}
还可以进行循环
{% for book in book_list %}
{{ book.id }}{{ book.title }}{{ book.price }}{{ book.date }}{{ book.publish }}{{ book.auth }}{% endfor %}
还能进行很多{% if %}等等
自定义标签
首先在你要加载这个tag的app中新建一个名为templatetags的Python Package,在这个包里面创建一个模块,模块里面就是自定义的标签,引入的时候直接引入这个模块的名字即可 { % load 模块名 % }
编写
比如模块文件名为my_tag.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
@register.simple_tag
def simple_tag_multi(v1,v2):
return v1 * v2
@register.simple_tag
def my_input(id,arg):
result = "" %(id,arg,)
return mark_safe(result)
在模板中导入的时候
{% load mytags %}
{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}
注意:
为了让 {{ load }} 标签工作,包含自定义标签的应用必须在INSTALLED_APPS中。
app下创建的包必须为templatetags
包里面可以创建任意多个任意名字的模块,只是引用的时候引用相应的模块名即可
模板的继承
基类
{% block title %}{% endblock %}{% block container%}
{% endblock %}
模板使用
{% extends "base_logre.html" %}
{% block title %}
欢迎登陆CyanScikit科技网站
{% endblock %}
{% block container %}
...新的内容
{% endblock %}
注意的几点:
开头引用基类{% extends "base_logre.html" %}
然后在类里面补充内容
{% block title %}
欢迎登陆CyanScikit科技网站
{% endblock %}
一个基类可以创建很多个引用块