风清扬

导航

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' %}">

  

 

 

  

 

posted on 2019-02-18 17:04  卜戈的博客  阅读(144)  评论(0)    收藏  举报