django -- 母版继承
csrf_token
在之前我们提交post请求的时候,都是在setting.py文件里注释掉了 'django.middleware.csrf.CsrfViewMiddleware' 这一行,这是因为form表单提交数据时,Django防止恶意者进行攻击,出于安全的考虑,试想一下,你自己写的django后台,别人写了一个页面,action里地址写的是你的服务器的地址,如果这个人写的代码是攻击你网站的,如果你网站不做校验就接收了。那很有可能会出问题,所以django默认会拒绝掉post请求,如果不想注释掉那行代码,只需要在form表单里加上如下一行代码就可以了
{% csrf_token %}
这时候我们去网页上查看代码,会发现页面多了一个隐藏的input标签,这样的话Django就能区分是我们自己写的HTML文件还是别人的,如果HTML文件里没有这行就会报错
<input type="hidden" name="csrfmiddlewaretoken" value="Faz2aNAt5PaPVW93espQ12sT9DyZtqqIpsSC089vfcdgA072I4dTMbPzsStKxmUB">
母板
在我们写HTML的时候,有些页面大体都是相同的,比如博客园,只有第二部分是不同的,其余的都是相同的,这时候我们可以把公共的代码提取出来,我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
public_main.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>Dashboard Template for Bootstrap</title>
<!-- Bootstrap core CSS -->
<link href="/static/bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet">
<link href="/static/dashboard.css" rel="stylesheet">
</head> <body> <div > 这里写公共的代码
<div > 这里也写公共的代码 {% block main_page %} 这里是给继承这个模版写的代码,后面的main_page随便起 {% endblock %} </div>
</div> <script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.js"></script>
</body>
</html>
这样我们就创建好了一个母版,那怎么使用母版呢?我们创建一个index.html
{% extends 'list/public_main.html' %} 继承母版,注意,要用/,前面的list是目录名 {% block main_page %} <div class="c1"> 这里写自己的代码,会把这里面的代码放到母版里的那两行代码之间 {% endblock %}
注意:
1.继承的代码写在第一行
2.继承的母版的名字必须用引号引起来
3.自定义的内容写在 block中
4.定义多个block块,一般要有js,css
总结:
{% extends 'xxxx.html' %}来继承母版
通过在母板中使用{% block xxx %}
来定义"块"。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
组件
在来看看博客园,上面的导航栏是不是也是每个页面都有的,我们也可以把导航栏写成一个组件,在其他页面导入,组件就是一个HTML代码
创建一个xxx.html文件,里面写上一些HTML代码
然后在母版中或者其他的页面引用
{% include 'xxx.html' %}
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如上语法导入即可。
静态文件相关
我们在前面写的css,js文件,都在static目录下放着,引用方式如下
<script src="/static/jquery-3.3.1.js"></script>
前面的static是setting.py文件里STATIC_URL的值
STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀
但是如果有一天,我们需要把STATIC_URL 的值换一个,比如换成staticfile,这时候就要把所有引用到的都要改成staticfile
我们可以使用 {% load static %} 来引用静态文件,这时不管你静态文件改为什么都不用改其他地方的代码
先来看下没修改之前的
<!-- Bootstrap core CSS -->
<link href="/static/bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet"> <!-- 当前页面用到的自定义样式 -->
<link href="/static/dashboard.css" rel="stylesheet"> <script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.js"></script>
改之后,字符串里最开始不需要/,django会帮我们拼接,这样,我们随便改STATIC_URL 的值,都不需要改静态文件的导入地址
<!-- Bootstrap core CSS -->
<link href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}" rel="stylesheet"> <!-- 当前页面用到的自定义样式 -->
<link href="{% static 'dashboard.css' %}" rel="stylesheet"> <script src="{% static 'jquery-3.3.1.js' %}"></script>
<script src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script>
某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
get_static_prefix
先在html文件里 加上下面两句代码,看是什么
{% load static %}
{% get_static_prefix %}
用开发者工具查看结果,
/staticfile/
结果就是setting.py里的STATIC_URL 的值,这样的话,上面的代码我们就可以写成
<!-- Bootstrap core CSS -->
<link href="{% get_static_prefix %}bootstrap-3.3.7/css/bootstrap.css" rel="stylesheet"> <!-- 当前页面用到的自定义样式 -->
<link href="{% get_static_prefix %}dashboard.css" rel="stylesheet"> <script src="{% get_static_prefix %}jquery-3.3.1.js"></script>
<script src="{% get_static_prefix %}bootstrap-3.3.7/js/bootstrap.js"></script>
两种方法效果都是一样的,第一种方法是Django帮我们拼接,第二种方法是我们自己拼接
simpletag
和自定义filter类似,filter最多只能有两个参数,而且一个还是变量。而filter可以接受更灵活的参数
from django import template register = template.Library() # 固定写法,生成一个注册实例对象 @register.simple_tag()
def join_str(*args, **kwargs):
return '-'.join(args)
在html里使用自定义的simple tag
{% load add_str%} <!-- add_str为templatetags包下的py文件名 --> <!-- 使用里面的join_str函数,后面的都是参数 -->
<p>{% join_str 'zou' 'is' 'IT' k1='job' k2='bob' %}</p>
这样页面上的展示效果为:
<p>zou-is-IT</p>
inclusion_tag
用于返回一些HTML代码段,返回的是字典格式的
在templatetags创建一个my_inclusion.py文件
from django import template register = template.Library() @register.inclusion_tag('page.html') # 需要传一个文件名
def page(total, current_num):
return {'total': range(1, total + 1), 'current_num': current_num}
page.html
{% for num in total %}
{% if num == current_num %}
<li class="active"><a href="#">{{ num }}</a></li>
{% else %}
<li><a href="#">{{ num }}</a></li>
{% endif %}
{% endfor %}
最后在html页面里引用page函数
{% load my_inclusion %} 导入的py文件名
{% page 6 3 %}
代码解释:
定义了一个page函数,它接受两个参数,上面的装饰器需要一个参数文件名,返回的是一个字典,在页面中导入了这个函数,传了两个参数,一个为6,一个为3,page拿到这两个参数后,传给了page.html进行渲染。因为6在page里使用了range,然后再循环,结果就是1....6,在进行判断。渲染完之后返回了一个页面,来看个图加深一下理解
总结:
csrf_token
1. 放在form表单中
2. 在表单中添加了一个隐藏的input标签
name csrfmiddlewaretoken
valve askjdaskdhashdkasd 64位的字符串
母版继承
1. 定义一个母版 普通的HTML代码 base.html
2. 在母版中定义block块
3. 子页面中继承的母版 {% extends 'base.html' %}
4. 重写block块
注意事项:
1. {% extends 'base.html' %}写在第一行
2. {% extends name %} name写继承的母版的名字字符串
3. 自定义的内容写在block中
4. 定义多个block块 一般要有js css
组件
1. 写一段的代码 nav.html
2. {% include 'nav.html' %}
静态文件相关
1. {% load static %}
2. {% static '相对路径' %} ——》 去settings中获取STATIC_URL '/static/' 和相对路径进行拼接
3. {% get_static_prefix %} ——》 去settings中获取STATIC_URL '/static/'
"{% get_static_prefix %}相对路径"
自定义inclusion_tag
1. 在app下创建一个templatetags的python包 templatetags名字不能错
2. 在包下写py文件 mytags
3. 编辑文件
from django import template
register = template.Library()
4. 定义函数
可以接受参数,返回一个字典
5. 函数上加装饰器
@register.inclusion_tag('page.html')
6. 函数返回的字典 交给 xxx.html 渲染
django -- 母版继承的更多相关文章
- Django(五)母版继承、Cookie、视图装饰器等
大纲 一.内容回顾 补充:默认值 补充:命名空间 二.模板语言 1.母版继承 2.include 3.自定义simple_tag 三.Cookie Cookie 使用总结 四.视图 1.获取用户请求相 ...
- 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承
第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
- django (装饰器,母版继承,自定义,request对象,response对象)
1. 装饰器 1. def wrapper(fn): def inner(*args,**kwargs): 执行被装饰函数之前的操作 ret = fn(*args,** ...
- [oldboy-django][1初始django]后台管理页面的布局 + djano母版(继承html)
完善学员管理系统 - bootstrap fontawesome - 分页,路径导航,表格(class样式),消息图标(i标签),邮件图标(i标签) - 响应式导航 @media(min-width, ...
- Django模板导入及母版继承和自定义返回Html片段
1.ROOT_URLCONF = '总路由所在路径(比如untitled.urls)'<===默认情况是这样 根路由的路径是可以修改的:ROOT_URLCONF = app01.urls< ...
- Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静态文件的加载load static),自定义simple_tag和inclusion_tag
Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静 ...
- Django用户继承AbstractUser后密码为明文
Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...
- Django admin 继承user表后密码为明文,继承UserAdmin,重写其方法
Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...
- [py][mx]django模板继承-课程列表页
课程列表页分析 1,机构类型 2,所在地区 3.排序 学习人数 先分析下 纵观页面,页头页脚都一样. django提供了模板继承. 至少 不同页面的title 面包屑路径 content内容不一致,以 ...
随机推荐
- [转帖]从零开始入门 K8s | 手把手带你理解 etcd
从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...
- Matlab中添加语音处理(voicebox)工具箱
系统环境 win10+Matlab2017b 下载voicebox工具箱 官方下载:http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.zip ...
- How to get the free disk space in PostgreSQL (PostgreSQL获取磁盘空间)
Get the current free disk space in PostgreSQL PostgreSQL获取磁盘空间 from eshizhan Here has a simple way t ...
- 一问带你区分清楚Authentication,Authorization以及Cookie、Session、Token
上周写了一个 适合初学者入门 Spring Security With JWT 的 Demo .Demo 地址:https://github.com/Snailclimb/spring-securit ...
- 【selenium】基于python语言,如何用select选择下拉框
在项目测试中遇到了下拉框选择的控件,来总结下如何使用select选择下拉框: 下图是Select类的初始化描述,意思是,给定元素是得是select类型,不是就抛异常.接下来给了例子:要操作这个sele ...
- C# 【Http请求返回】性能优化500毫秒到 60 毫秒
偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多.C# HttpRequest 要500毫秒 而Chrome 只需要 39ms. 作为有责任感的 码农.这个 必须 ...
- .NetCore之基础
.NetCore几大特点 这篇文章主要从.NetCore全面开源.依赖注入.包引入.跨平台.应用服务器的特点来入手.大约需要10分钟的阅读时间. 与.Net的区别 在.Net与.NetCore在代码编 ...
- 使用vue导出excel文件
今天再开发中遇到一件事情,就是怎样用已有数据导出excel文件,网上有许多方法,有说用数据流的方式,https://www.cnblogs.com/yeqrblog/p/9758981.html,但是 ...
- Oracle自定义脱敏函数
对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名.证件号.地址等等,下面是自定义函数的代码 CREATE OR REPLACE FUNCTION F_GE ...
- 一个APACHE TOMCAT漏洞修复
这种情况加个SSL证书就行了 就是HTTPS协议