Django之路(五)——Template模块
本节内容
- 概念
- 配置模板引擎
- Django模板语言
- 引入静态文件
一、概念
用户的URL请求通过URL调度器转发给View处理返回相应内容,但通常返回的内容为HTML等前端内容,为了使业务逻辑处理和页面展示功能分离引入模板(Template)系统
二、配置模板引擎
默认设置
TEMPLATES = [
    # 每条模板引擎使用{}
    {
        #django 默认的模板引擎路径。django.py  jinja2
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #需要渲染的模板路径
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        #加载的app 可以独立设置自己的模板路径。True 查找 app/templates/app 里待渲染内容
        'APP_DIRS': True,
        #可选参数
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
工作原理
模板引擎(Engine) 加载HTML生成模板对象(Template)并传入上下文对象(Context),调用render方法进行渲染最终生成原生态的HTML文件
常见做法
- project/templates 存放全局模板文件。例:404.html 。
- 每个app/templates/app 下存放各自的模板文件
- 使用快捷函数render 进行模板调用渲染。例:render(request, 'polls/index.html', context)
三、Django模板语言
即HTML文件中使用Django内置一种语言实现动态HTML生成
变量{{}}
#views.py
def index(request):
    import datetime
    s = "hello"
    l = [111, 222, 333]  # 列表
    dic = {"name": "yuan", "age": 18}  # 字典
    date = datetime.date(1993, 5, 2)  # 日期对象
    class Person(object):
        def __init__(self, name):
            self.name = name
    person_yuan = Person("yuan")  # 自定义类对象
    person_egon = Person("egon")
    person_alex = Person("alex")
    person_list = [person_yuan, person_egon, person_alex]
    return render(request, "polls/index.html", {"l": l, "dic": dic, "date": date, "person_list": person_list})
#index.html
<body>
    <h4>{{s}}</h4>
    <h4>列表:{{ l.0 }}</h4>
    <h4>列表:{{ l.2 }}</h4>
    <h4>字典:{{ dic.name }}</h4>
    <h4>日期:{{ date.year }}</h4>
    <h4>类对象列表:{{ person_list.0.name }}</h4>
</body>
变量过滤器{{obj|filter__name:param}}
常见内置过滤器
- default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:{{ value|default:"nothing"}}
- length:返回值的长度。它对字符串和列表都起作用。例如:{{ value|length }}
- filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸。例如 '13 KB','4.1 MB','102 bytes'
- date:将值按照给定的方式格式化。{{ value|date:"Y-m-d"}}
- safe:变量进行转义。例如:value="<a href="">点击</a>"{{ value|safe}}
更多猛点这里
标签{%%}
for标签
{% for person in person_list %}
    <p>{{ person.name }}</p>
 
{% empty %}
    <p>sorry,no person here</p>
{% endfor %}
if标签
{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}  
with标签
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}
更多猛点这里
自定义标签和过滤器
#app/templatetags/mytag.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library()  # register的名字是固定的,不可改变
@register.filter  # 定义一个过滤器
def filter_multi(x, y):  # 实现一个简单的乘法函数
    return x * y
@register.simple_tag  # 定义一个标签
def multi(x,y):
    return x * y
#index.html
{% load mytags %}
{{ 10|filter_multi:2 }}
{% multi 10 20 %}
四、引入静态文件
在模板文件中引入css、js、图片等
目录结构
E:\mysite\polls>tree /f 卷 学习 的文件夹 PATH 列表 卷序列号为 0F64-1B70 E:. │ admin.py │ apps.py │ models.py │ tests.py │ urls.py │ views.py │ __init__.py │ ├─migrations │ │ __init__.py │ │ │ └─__pycache__ │ __init__.cpython-37.pyc │ ├─static │ └─polls │ ├─css │ │ style.css │ │ │ ├─images │ └─js ├─templates │ └─polls │ index.html
index.html文件引入css
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/css/style.css' %}">
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号