Django(1)-简介
Django(2)-创建项目及默认项目目录结构介绍
Django(3)-配置文件详解
Django(4)-URL和视图
Django(5)-路由配置实例
Django(6)-请求及响应
Django(7)-Get请求和Post请求
Django(8)-设计模式
Django(9)-模板层简介与入门实例
Django(10)-模板层的变量和标签
Django(11)-模板层的过滤器和继承
Django(12)-url反向解析
Django(13)-静态文件
Django(14)-应用及分布式路由
Django(15)-模型层及ORM介绍
Django(16)-ORM基础字段及选项
Django(17)-ORM创建数据
Django(18)-ORM常用的查询函数详解及实例演示
Django(19)-ORM条件查询
Django(20)-ORM更新操作及实例演示
Django(21)-ORM删除操作及实例演示
Django(22)-ORM中F对象和Q对象
Django(23)-ORM聚合查询和原生数据库操作
Django(24)-admin后台管理设置步骤以及常见样式详解
Django实战技巧(1)-开发测试生产环境配置切换处理技巧
Django实战技巧(2)-git代码仓分支管理技巧
Django实战技巧(3)-项目配置
1、模板过滤器
- 定义:在变量输出时对变量的值进行处理
- 作用:可以通过使用过滤器来改变变量的输出和显示
- 语法:{ {变量 | 过滤器1:‘参数1’|过滤器2:'参数2’}}
2、常见的过滤器
- lower:将字符串全部转换为小写
- upper:将字符串转换为大写
- safe:默认不对变量内的字符串进行html转义
- add:‘n’:将value的值加n
- truncatechars:‘n’:如果字符串字符多余指定的字符数量,那么会被截断,截断的字符串将以可翻译的省略号序列(…)结尾
实例:
设计路由如下:
视图函数如下:
from django.shortcuts import render
def test_filter(request):
str="Hello Tom"
num=100
html="<body>hello</body>"
return render(request,"test_html.html",locals())
在templates目录下创建test_html.html文件,内容太如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test_for</title>
</head>
<body>
<p>字符串小写:{
{str|lower}}</p>
<p>字符串大写:{
{str|upper}}</p>
<p>整数加法:{
{num|add:'200'}}</p>
<p>html 默认:{
{html}}</p>
<p>html safe:{
{html|safe}}</p>
</body>
</html>
在浏览器打开http://127.0.0.1:8080/test_filter,结果如下:这里可以看出,django默认的是把html文本作为纯文本处理的,只有显示的告诉django这是safe的,django才会按照html的语法去解析
3、模板的继承
-
如下图所示,通常情况下,一个网站的顶部和底部,甚至有的侧边朗都是完全一样的,不同的仅仅是中间的内容部分,如果不使用继承,在每个页面都必须要做头部和尾部,这样带来一个问题就是如果头部或尾部需要修改,则所有页面都需要修改,这显然不符合常规做法
-
模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容,并可以覆盖覆膜板中的相应的块
-
语法:父模板中
- 定义父模板块block标签
- 标识出哪些在子模块中是允许被修改的
- block标签:在父模板中定义,可以在子模板中修改覆盖
-
语法:子模板
-
继承模板extends标签(写在模板文件的第一行)
如:{ % extends 'base.html' %}
-
子模板重写父模板中的内容块
{% block block_name %} 子模板块用来覆盖父模板块中block_name块的内容 {% endblock %}
-
实例:
设计如下三个路由:
视图函数实现如下三个函数
from django.shortcuts import render
def base_view(request):
return render(request,"base.html")
def index1_view(request):
return render(request,"index1.html")
def index2_view(request):
return render(request,"index2.html")
在templates目录下创建base.html,index1.html,index2.html三个文件
base.html:定义了两个可以被继承修改的块,title和info
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block title %}
<title>网站首页</title>
{% endblock %}
</head>
<body>
<a href="/base_view">网站首页</a>
<a href="/index1_view">第一个index页面</a>
<a href="/index2_view">第二个index页面</a>
<br>
{% block info %}
这是主页
{% endblock %}
<br>
<h3>有问题请联系400000001</h3>
</body>
</html>
index1.html
{% extends "base.html" %}
{% block title %}
<title>第一个index页面</title>
{% endblock %}
{% block info %}
<p>欢迎来到第一个index页面</p>
{% endblock %}
index2.html
{% extends "base.html" %}
{% block title %}
<title>第2个index页面</title>
{% endblock %}
{% block info %}
<p>欢迎来到第二个index页面</p>
{% endblock %}
浏览器打开 http://127.0.0.1:8080/base_view,然后点击三个链接,可以看到不管切换到哪个网页,头部和底部都是不变的,只有中间正文以及页面名称才会发生改变
- 模板继承有一个点需要注意一下,当在父模板中使用了变量,那么当子父模板对应的视图函数传入变量值时,子模板对应的页面时拿不到此变量值的,同样,如果子模板的视图函数传入了此变量的值,那么也只能在此子模板对应的页面展示,父模板同样也是拿不到的,这个和编程语言的继承还是有一些区别的