详解Django模板层过滤器和继承的问题
作者:Neptuneyut 发布时间:2023-02-08 06:28:04
过滤器
模板层对变量的操作实际还有很多,过滤器就是其中一种。学过Linux系统的一定知道管道操作符,其可以将上一步输出直接作为下一步输入进行处理,这里的过滤器就是类似管道符,其写法也是以管道符|
为标志,允许我们对模板层获得的变量进行改变,例如大小写转换、增减大小等等
语法
{{ 变量|过滤器1|过滤器2:'值' |...}}
这里的过滤器可以分为两类,一类是不带参数的,例如lower,upper,safe
;一类是带参数的add:'10'
,冒号分隔,后面跟上值
过滤器 | 示例 | 说明 |
---|---|---|
lower | {{str | lower}} |
upper | {{str | upper}} |
safe | {{script | safe}} |
add | {{num | add:‘10'}} |
示例:
views.py
def home(request):
dic = {}
dic['str'] = 'abc'
dic['num'] = 90
dic['script'] = '<script>alert("这是测试过滤器safe")</script>' #简单的js代码,可以弹出一个窗口
return render(request, 'home.html', dic)
home.html
<body>
<h2>过滤器upper: {{ str|upper }}</h2> # 全变成大写字母
<h2>过滤器add: {{ num|add:'10' }}</h2> # 加10
<h2>过滤器safe: {{ script|safe }}</h2> # 不进行html转义,适用直接执行js代码,理解为代码安全可以直接执行
</body>
如果不适用safe
则输出原始字符串,不会执行js代码
除了以上过滤器,更多过滤器请参见https://docs.djangoproject.com/zh-hans/3.2/ref/templates/builtins
继承
对于某个网站来说,一般又比较统一的风格,例如无论点击网页哪个标签或者链接,导航栏和尾部都是基本一样的内容,真正变的是中间的内容区域,如何才能让不同的网页有相同也有差异呢,django中对模板可以使用继承的概念。
例如,有如下页面,由三部分组成,第一块是导航栏,无论哪个子页面均是一样,中间body区会因为点击导航栏不同项目发生变化,而最后一块尾部每个页面都是一样,如何实现上述要求呢?
求同:Django模板层通过
{% extends 'home.html' %}
实现子页面对home.html的继承,也就是说只需要在每个子页面写上该行代码即能完成对父页面的继承,但是需要注意的是不能继承父页面的相关视图函数的变量存异:在父页面(home.html)中使用
{% block block_name %}...{% endblock block_name(可选) %}
标记块,凡是在标记块中的内容在子页面都可以被修改,修改方法是在{% block block_name %}子页面重写内容{% endblock block_name(可选) %}
块中重新更改内容即可
home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!-- 导航栏,每个页面都一样 -->
<h2>
<a href="/home" rel="external nofollow" >主页</a>
<a href="/music" rel="external nofollow" >音乐频道</a>
<a href="/sport" rel="external nofollow" >运动频道</a>
</h2>
<h2>
{% block body %}
<h2>欢迎来到主页!(该部分区域因页面而异)</h2>
{% endblock %}
<h3>如有问题请请联系xxx@163.com(每个页面都一样)</h3>
</body>
</html>
music.html
{% extends 'home.html' %}
<!-- 修改body区域内容 -->
{% block body %}
<h2>欢迎来到音乐频道!</h2>
{% endblock %}
sport.html
{% extends 'home.html' %}
<!-- 修改body区域内容 -->
{% block body %}
<h2>欢迎来到运动频道!</h2>
{% endblock %}
views.py
import re
from django.http import HttpResponse
from django.shortcuts import render
def home(request):
return render(request, 'home.html', dic)
def music(request):
return render(request, 'music.html')
def sport(request):
return render(request, 'sport.html')
urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('home/', views.home),
path('music/', views.music),
path('sport/', views.sport),
]
学到这里,大家又可以小激动一下了,一个静态网页的基本架构慢慢成熟起来,将一个主页应用到其他页面,同时又保持其他页面的差异,django的模板思想越来越清晰了。
来源:https://blog.csdn.net/qq_42491125/article/details/118548303


猜你喜欢
- 压缩包版类似文章有一些问题,缺少了data的初始化,因此结合几个文章完善了一下,希望对Windows上安装者有帮助。MYSQL安装的时候可以
- 函数声明为:func Notify(c chan<- os.Signal, sig ...os.Signal)官方描述:Notify函
- pycurl是功能强大的python的url包,是用c语言写的,速度很快,比urllib和httplib都快调用方法:import pycu
- 前言Python包含6种内置的序列:列表、元组、字符串 、Unicode字符串、buffer对象、xrange对象。在序列中的每个元素都有自
- 因为外贸网站,禁止同行抄袭,所以防止中国ip访问访问,访问的时候有密码提示,这样的代码如何写.请给一个提示.或者有好的代码,请分享下。 &n
- 慢查询日志概念MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过lon
- 1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PH
- 知识补充表单简介(来自Mr._Dang)action:提交的地址method:提交的方式 get: 参数是在url中的,不安全,传输量比较少
- 本文详细解说了MySQL Order By Rand()效率优化的方案,并给出了优化的思路过程,是篇不可多得的MySQL Order By
- 一、准备短信发送平台首先进入http://user.ihuyi.com/nav/sms.html互亿天线,并且注册,进入首页注册
- 这里要注意的是js的时间戳是13位,php的时间戳是10位,转换函数如下: var nowtime = (new Date).getTime
- 多层索引的创建普通-多个index创建在创建数据的时候加入一个index列表,这个index列表里面是多个索引列表Series多层索引的创建
- 好久没写技术相关的文章,这次写篇有意思的,关于一个有意思的游戏——QQ找茬,关于一种有意思的语言——Python,关于一个有意思的库——Qt
- 本文实例讲述了Python实现读取字符串按列分配后按行输出。分享给大家供大家参考,具体如下:问题:输入一个字符串和一个数字,数字代表分为几行
- 1.在使用MySQL和php的时候出现过中文乱码问题(1) 只要是gb2312,gbk,utf8等支持多字节编码的字符集都可以储存汉字,当然
- python运行问题Traceback (most recent call last)出现报错traceback(most recent c
- 前言Python语言处理字符串、数组类的问题时有一定概率需要使用切片方法,比如:Leetcode_5。学习官方解法时发现切片的索引可以超出字
- tf.app.flags命令行参数解析模块说道命令行参数解析,就不得不提到 python 的 argparse 模块,详情可参考我之前的一篇
- 如何在安装setuptools模块时不生成egg压缩包而是源码 Q:如何在安装setuptools模块时
- 在我前一阵子刚刚写了“HTML5与Flash,不得不说的话题”的评论后,如各位所料,由于牵扯到多方利益和未来标准制定的角色份量,这不,有可能