上一节学会了怎么使用 django 创建项目,以及创建app,这次学习在一个app中使用网页模版。

  • 一、模版语法规则

      • 1.1、变量 : {{ var }}**
      • 1.2、标签 : {% var %}**
      • 1.3、过滤器 :{{var | filter}}
      • 1.4、注释 :{# 我是注释 #}
    • 1.5、关于模版语言更完整的文档
  • 二、使用模版
    • 2.1.第一种使用方式
    • 2.2.第二种使用方式
  • 三、自定义模版标签/过滤器
    • 3.1自定义模板标签

一、模版语法规则

========

我们都知道,一个静态HTML网页就是一堆含有特殊含义字符串的组合,在django的HTML模版中,有如下语法规则:

1.1、变量 : {{ var }}**

变量的用法很简单,也和能基本,一个变量从context中输出一个值,这是一个类似字典的对象将键映射到值。

例子1:标准用法
比如在HTML模版中的文本使用如下写法:

我的名字是:{{ name }}

在视图函数中使用:

context={}
context['name'] = 'peter'
return render(request,'app/yourtemplates.html,context)

然后运行服务器展示该网页的时候就会显示: 我的名字是peter

例子2:字典索引以及函数使用
在HTML模版中写:

我的名字是:{{person.name.upper}},年龄为{{person.age}}

在视图函数中写:

 person = {'name':'perter','age':'15'}context={}context['person'] = personreturn render(request, 'blog/temp.html',context)

该模版就会显示 : 我的名字是:PERTER,年龄为15

注:该方法使用的是python中字符串的通用方法,并且可以套接使用,比如 {{person.name.lstrip.upper}} 意思就是去掉左边空格并大写,如果要使用自己写的方法详情可以百度 django 自定义模版函数….

1.2、标签 : {% var %}**

标签在渲染过程中提供任意的逻辑。
这个定义有点含糊不清。例如,标签可以输出内容,用作例如控制结构。一个“if”语句或一个“for”循环,从数据库中获取内容,甚至可以访问其他模板标签。
标签被{%和%}包围,如下所示:
{%csrf_token%}

大多数标签接受参数:
{%cycle ‘odd’ ‘even’%}

一些标签需要开始和结束标签:
{%if user.is_authenticated%} Hello,{{user.username}}. {%endif%}

可以使用内置标签的参考以及编写自定义标签的说明,这里我列表出一些常用的标签:

标签 解释
{% for … %} ….{% endfor %} 在第一个语句的for后面添加循环逻辑,中间写循环内容
{% if … %} …[…{% elif … %}…{% else %}…]..{% endif %} 在第if和elif语句的后面添加判断逻辑,中间写判断内容.[]中的内容可选
{% ifequal .. ..%}…..{% endifequal %} 在第ifequal后面比较两个值,如果相等则显示之间的所有值
{% block …%}…..{% endblock %} 块标签,用于模版继承,继承该模版的模版都得实现该块中的内容
{% include …. %}td> 包含标签,后面填写包含的.html,一般用于包含公共的页头/页尾/Logo等
{% extends … %} 用于继承.html模版

1.3、过滤器 :{{var | filter}}

过滤器转换变量和标记参数的值。
例子:
{{ name|lower }} //将变量变为小写
{{my_date | date:“Y-m-d”}} //改变时间显示格式

过滤器还可以套接 : {{ my_list|first|upper }} 等..

这里我列表出一些常用的过滤器: (引用自django架站16堂课)

名称 用途 示例
capfirst 把第一个字母改为大写 { {value|capfirst} }
center 把字符串内容居中 { {value|center:”12”} }
cut 把字符串中指定的字符删除 { {value|cut:” “} }
date 指定日期时间的输出格式 { { value|date:”d M Y”} }
linebreaksbr 置换\n成为,<br/> { {value|linebreaksbr} }
linenumbers 为每一行字符串加上行号 { {value|linenumbers } }
lower 把字符串转换为小写 { {value|lower } }
random 把前面的串行元素使用随机的方式任选一个输出 { {value|random } }
striptags 把所有的HTML标记删除 { {value|striptags } }
truncatechars 提取指定字数的字符 { {value|truncatechars:40 } }
upper 把字符串转为大写 { {value|upper } }
wordcount 计算字数 { {value|wordcount } }

1.4、注释 :{# 我是注释 #}

{#这句话在django的HTML模版中会被忽略#}
{%comment%} 标记提供了多行注释

1.5、关于模版语言更完整的文档

https://code.ziqiangxuetang.com/django/django-template2.html

二、使用模版

2.1.第一种使用方式

关于模版的使用,我查阅资料,发现两种使用方式…
第一种,直接在当前APP文件夹中创建templates文件夹,在里面创建APP名的文件夹,再在里面创建模版,这种方式的优点是:当前APP的所有模版都在当前APP目录下,便于查找和使用。缺点是:如果好几个APP有一个共同的模版的话,虽然可以复用,但由于模版放在 templates/Appname 目录下,基模版文件只得放在工程根目录的templates下,文件比较分散。

Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于Python找包)。这样设计有利当然也有弊,有利是的地方是一个app可以用另一个app的模板文件,弊是有可能会找错了。所以我们使用的时候在 templates 中建立一个 app 同名的文件夹,这样就好了。

在settings.py中的INSTALLED_APPS中添加APP的名字,然后在写视图函数的过程中就能直接通过 appname / temp.html的形式引用模版了,如下例:

def index(request):a_list=['1','2','3','','4','5','6']context={}context['a_list'] = a_listreturn render(request, 'blog/temp.html',context)

2.2.第二种使用方式

第二种,是在 django1.9的一本书上看到的,直接在工程根目录创建templates文件夹,然后在里面创建子文件夹和模版,再在setting.py中的TEMPLATES列表中添加该目录:

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',],},},
]

在这添加模版目录后就可以在视图函数中这样引用了:

from django.shortcuts import render  #render 引用模版html 可以发送字典参数(模版context实例化)
from django.http import HttpResponse
from .forms import AddForm
from django.template.loader import get_template   # 可以从setting.py中设置的template位置中获取模版文件
# locals()函数,把当前内存中所有的局部变量使用字典类型打包起来,可以把这玩意传送给render作为模版中的值def homepage(request):template = get_template('index.html')posts = Post.object.all() #从模型函数中的post对象获取全部对象now = datetime.now()  #获取当前时间html = template.render(locals())return HttpResponse(html)

三、自定义模版标签/过滤器

3.1自定义模板标签

django中的模板的确是好用的东西,但很多标签,过滤器不大符合习惯,或者找不到自己需要的,这时候就得自定义模板标签以及过滤器了。

自定义标签和过滤器必须依赖于一个django app,也就是说,自定义标签和过滤器是绑定app的。该app应该包含一个templatetags目录,这个目录一个和model.py,views.py在同一个层级,记得在该目录下建立一个init.py文件一遍django知道这是一个python包。例子如下:


from django import template
from django.utils.safestring import mark_safe  #mark_safe函数能使html字符进行转义register = template.Library()  #获取模板装饰器######################定义过滤器####################@register.filter
def filter_multi(context, v1):  #定义一个过滤器最多只能有一个参数return context * v1######################定义标签#####################@register.simple_tag
def simple_tag_multi(context, v1):  #定义标签能有多个参数 使用为{%  %}return context * v1

使用方法为:
1.在需要使用该标签的template中使用{% load my_tag %}

template.html  <- 文件名{% load  my_tag %}

关于自定义标签,更详细的文档请参考:
https://www.cnblogs.com/qwj-sysu/p/4246605.html

参考:
https://docs.djangoproject.com/zh-hans/2.0/topics/templates/
https://code.ziqiangxuetang.com/django/django-template.html
https://www.cnblogs.com/sxh-myblogs/p/7724814.html
Django架站的16堂课

Django建站 - 模板篇相关推荐

  1. Python+django建站入门篇(2):素数判断

    本文使用django框架搭建网站,运行之后,获取用户输入的整数,判断是否为素数并进行相应的提示. 本文技术要点: 1)使用django创建网站 2)了解MVC开发模式 3)设置路由 4)接收用户输入 ...

  2. Python+django建站入门篇:Hello world

    第一步,进入命令提示符,切换至Python安装目录下的scripts目录,执行命令pip install django安装django扩展库. 第二步,使用命令创建网站项目helloworld,进入项 ...

  3. 从零开始学建站-主机篇

    从零开始学建站-主机篇 主机的基础知识 对于网站来说,主机的意义不同于传统意义的PC.简单地说,主机就是存放网站内容的地方,可以称之为"主机空间"."网站服务器" ...

  4. 第一章 Django 建站基础

    第一章 Django建站基础 1.1网站的定义及组成 网站(website)组成: (1)域名:www.baidu.com (2)空间服务器:虚拟主机,独立服务器,vps (3)DNS域名解析 (4) ...

  5. 程序代码移植和烧录需要注意什么_购买建站模板需要注意什么问题

    购买建站模板需要注意什么问题?现在市面上出现的建站工具质量参差不齐,但是如此多的建站模板,应该选择哪个呢?如此多的建站工具平台应该怎么样选择呢?这里我们来聊一聊. 北京网站建设公司-东浩联创 现在非常 ...

  6. 阿里云自营建站服务,精美建站模板

    企业官网定制 企业官网是企业的互联网形象,注重品牌就选量身定制,建站一条龙服务,一站式服务就选阿里云 精美建站模板 无需技术,也能自己建网站,千套行业模板,上百行业覆盖,1小时快速上线 https:/ ...

  7. 8个精美的WordPress建站模板

    金属加工WordPress主题 wordpress建站模板,适合金属加工行业.金属冶炼.电焊相关行业官网的WordPress主题. 演示 https://www.jianzhanpress.com/? ...

  8. Hexo建站进阶篇(让hexo进入后台运行)

    Hexo建站进阶篇 此篇着重讲述如何使用hexo进行个人博客编写上传- 没有搭建好环境的童鞋请移动至此 -– Hexo建站总结-个人博客建站基础篇 继上篇开始~: 基础篇搭建完成后的小伙伴肯定有在为如 ...

  9. 腾讯云CloudPages建站模板搭建网站教程

    腾讯云建站CloudPages自助建站模板,建站神奇不需要会代码小白轻松搭建网站,CloudPages支持海量精美建站模板,可用于搭建企业官网.广告落地页.微信小程序等,支持PC.H5.小程序三端自适 ...

最新文章

  1. php 二叉树 与赫夫曼树
  2. 给定数组 求和等于固定值 算法_别人家的面试题:不可变数组快速范围求和
  3. 检测网络状态的工具类
  4. 十分钟搞定 pandas
  5. 用 ReactJs 创建Mac版的 keep
  6. 深入理解JVM之JVM内存区域与内存分配
  7. 由外而内看敏捷软件开发(上)——从业务视角看敏捷
  8. 用java语言写一个实用小程序_用java语言,编写一个小程序。
  9. SQL语法提示工具SQL Prompt 发布v10.6
  10. 北理珠计算机学院学生会,梦回北理
  11. 如何成为一名数据分析师
  12. WPS自动生成目录。
  13. 【Linux】VirtualBox设置静态ip
  14. 微信Windows版无法备份聊天记录
  15. 借道IIS搭建企业内部Web方式文件共享平台
  16. 2023年考ACP云计算
  17. Ros 全局规划使用carrot_planner/CarrotPlanner和global_planner/GlobalPlanner
  18. Excel下拉菜单怎么做?Leo老师来教你!
  19. R中install_github中无法安装遇到的问题与解决方法
  20. PYTHON 解决小学奥数找规律之一

热门文章

  1. python pdb模块_使用Python中PDB模块中的命令来调试Python代码的教
  2. react antd modal学习
  3. gitlab搭建(1)---centos7搭建gitlab服务器
  4. 系統封裝(6)--EZBOOT設置
  5. 多核处理器_一台手机的核心!处理器的top5你知道吗?
  6. 39.超市微信促销活动5
  7. uni中onLoad与onShow周期的区别
  8. 2022年证券从业资格证券市场基本法律法规考试多选题专练及答案
  9. wsdl2java asmx_在WebService asmx中格式化SOAP消息
  10. Json完整版介绍和工具类解析应用