【Django】模板Templates

使用Django 的Templates系统,不仅实现了前后端分离、动态生成html;而且可以实现模板继承,减少重复代码等

前言

   Django 项目可以配置0个、一个或者多个模板引擎,当执行startproject命令创建项目时,会在settings.py文件中自动配置默认使用一个模板引擎,如下

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': (os.path.join(BASE_DIR, 'templates'),#自定义路径
                    ),#更推荐使用元组,因为不可修改
        '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',
            ],
        },
    },
]

   BACKEND字段:实现Django后端API的模板引擎类,内置有:django.template.backends.django.DjangoTemplatesdjango.template.backends.jinja2.Jinja2

   DIRS字段:定义引擎应按搜索顺序查找模板源文件的目录列表,如上:搜索项目下的templates目录

   APP_DIRS字段:告诉引擎是否应该在已安装的应用程序中查找模板,如上,设置为True,搜索各应用(app)下的templates目录。通常情况下,一个项目有多个app应用,为了分类管理及避免同文件使用错误,在app下创建templates目录结构为:app/templates/app/**.htmlapp这里的需要替换成具体的名称,视图中引用模板,使用相对templates目录的路径,即app/**.html

   OPTIONS字段:特定后端的配置

根据上述配置,设置了APP_DIRS=True,模板引擎搜索templates顺序为:DIRS > 当前项目安装app的templates目录 > 其他已安装app的templates目录,找到就停止搜索,找不到就抛出异常

由于历史原因,模板引擎的通用支持和Django模板语言的实现都存在于django.template 命名空间中
django.template.loader模块定义了两个用于加载模板的函数
   get_template(template_name,using = None)返回一个 Template对象,找不到模板时会抛出django.template.TemplateDoesNotExist异常
   select_template(template_name_list,using = None) 根据模板名称列表。按顺序查找每个名称并返回存在的第一个Template对象
通过get_template()或select_template()返回Template对象,为对象提供了一个render()方法
   Template.render(context=None, request=None)
      context 模板上下文,为模板传递参数,字典类型
      request,HttpRequest类型,与引擎后端有关
render_to_string(template_name,context = None,request = None,using = None) 加载模板【get_template()或select_template()】和渲染【Template.render】,这是一个减少加载和渲染模板的重复性,django.template 提供的一个快捷方法

以上简单说明了模板引擎内部方法,真正使用时,可直接使用Django 提供的快捷方法django.shortcuts.render,无需重复造轮子

除了使用内置引擎,也可以自定义引擎,这里不做展开

模板语言DTL(Django Templates Language)

变量

  使用{{var}},若不存在,插入空字符

字典

模板中使用字典,与python语言使用有点区别
  获取键值对{{dicts.items}}
  获取值dicts.key #指定具体key

对象

  获取对象值obj.attr

列表

  获取索引值mylist.0

标签
标签
过滤器
过滤器

你可能感兴趣的:(【Django】模板Templates)