ORM模板层
1.模板语言之变量
def index(request):
name='lqz'
age=18
ll=['name','age']
dic={'name':name,'age':age}
class A:
school='oldboy'
obj=A()
def test():
print(11)
'
return render(request,'index.html',locals())
{{ 变量 }}:相当于print了该变量
在html中,如果变量是函数的话,则会执行函数,然后打印执行结果
注意:模板语言中,不支持函数带参数的用法
深度查询,统一都用句点符。只要能取到值,可以一直点下去。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板语言之变量</h1>
<p>{{ name }}</p>
<p>{{ age }}</p>
<p>{{ ll }}</p>
<p>{{ ll.0 }}</p>
<p>{{ dic }}</p>
<p>{{ dio.name }}</p>
<p>{{ A }}</p>
<p>{{ obj }}</p>
<p>{{ test }}</p>
</body>
</html>
模板不支持函数带参数。支持字符串自带的函数功能,不能传参,使用时直接点即可
name.upper
2.模板语言之过滤器
过滤器其实可以理解成内置的功能函数
过滤器的传参形式是:{{ ‘lqz’|add '+nb' }}
过滤器好像一定要传两个参数?
不用safe,则不会解析语句,使用safe后会进行解析语句。所以safe要谨慎使用。
date只支持datetime的转换
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板语言之变量</h1>
<p>{{ name }}</p>
<p>{{ age }}</p>
<p>{{ ll }}</p>
<p>{{ ll.0 }}</p>
<p>{{ dic }}</p>
<p>{{ dio.name }}</p>
<p>{{ A }}</p>
<p>{{ obj }}</p>
<p>{{ test }}</p>
<hr>
<h1>模板语言之过滤器</h1>
{#语法:{{ 第一个参数|过滤器名字:第二个参数 }},最多支持两个参数#}
{#常用过滤器#}
<p>统计字符串的长度:{{ name|length }}</p>
<p>统计列表的长度:{{ ll|length }}</p>
{#如果第一个参数值是false或者为空,使用给定的默认值,否则,使用变量的值#}
<p>过滤器之默认值:{{ ll2|default:'lqz' }}</p>
{#时间格式#}
<p>过滤器之date:{{ ctime|date:'Y-m-d' }}</p>
{#slice切割,区间前闭后开#}
<p>{{ ll|slice:'2:-1' }}</p>
{#truncatechars截断字符#}
<p>过滤器之truncatechars:{{ 'hnjskladjasl'|truncatechars:5 }}</p>
{#truncatecwords截断单词#}
<p>过滤器之truncatewords:{{ 'hello world nihao good help god '|truncatechars:5 }}</p>
{#过滤器之使用safe,会解析script语句,然后执行#}
<p>过滤器之用safe:{{ h1|safe }}</p>
{#过滤器之不用safe,不会解析script语句,所见即所得#}
<p>过滤器之不用safe:{{ h1 }}</p>
</body>
</html>
3.模板语言之标签
标签的传参形式是后面加引号括起来:{% add2 'xuxu' %}
forloop只能在for循环中使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板语言之变量</h1>
<p>{{ name }}</p>
<p>{{ age }}</p>
<p>{{ ll }}</p>
<p>{{ ll.0 }}</p>
<p>{{ dic }}</p>
<p>{{ dio.name }}</p>
<p>{{ A }}</p>
<p>{{ obj }}</p>
<p>{{ test }}</p>
<hr>
<h1>模板语言之过滤器</h1>
{#语法:{{ 第一个参数|过滤器名字:第二个参数 }},最多支持两个参数#}
{#常用过滤器#}
<p>统计字符串的长度:{{ name|length }}</p>
<p>统计列表的长度:{{ ll|length }}</p>
{#如果第一个参数值是false或者为空,使用给定的默认值,否则,使用变量的值#}
<p>过滤器之默认值:{{ ll2|default:'lqz' }}</p>
{#时间格式#}
<p>过滤器之date:{{ ctime|date:'Y-m-d' }}</p>
{#slice切割,区间前闭后开#}
<p>{{ ll|slice:'2:-1' }}</p>
{#truncatechars截断字符#}
<p>过滤器之truncatechars:{{ 'hnjskladjasl'|truncatechars:5 }}</p>
{#truncatecwords截断单词#}
<p>过滤器之truncatewords:{{ 'hello world nihao good help god '|truncatechars:5 }}</p>
{#过滤器之使用safe,会解析script语句,然后执行#}
{#<p>过滤器之用safe:{{ h1|safe }}</p>#}
{#过滤器之不用safe,不会解析script语句,所见即所得#}
<p>过滤器之不用safe:{{ h1 }}</p>
<hr>
<h1>模板语言之标签</h1>
{#{% for i in ll %}#}
{# 取出外层第几次循环#}
{# {% for person in person_list %}#}
{# {{ forloop.parentloop.counter }}#}
{# <p>{{ person }}</p>#}
{# {% endfor %}#}
{#{% endfor %}#}
{#循环的对象是空,才会走到empty#}
{#{% for foo in ll2 %}#}
{# <p>{{ foo }}</p>#}
{#{% empty %}#}
{# 傻屌#}
{#{% endfor %}#}
{#循环的是字典的value值#}
{#{% for v in dic.values %}#}
{# <p>{{ v }}</p>#}
{#{% endfor %}#}
{#循环的是字典的key:value值#}
{#{% for k,v in dic.items %}#}
{# <p>{{ k }}:{{ v }}</p>#}
{#{% endfor %}#}
{#{% if user %}#}
{# <a href="">退出</a>#}
{# {% else %}#}
{# <a href="">登录</a>#}
{# <a href="">注销</a>#}
{#{% endif %}#}
{#{% for l in ll %}#}
{# {% if forloop.first %}#}
{# <p>第一次的我</p>#}
{# {% elif forloop.last %}#}
{# <p>最后一次的我</p>#}
{# {% else %}#}
{# <p>{{ l }}</p>#}
{# {% endif %}#}
{#{% endfor %}#}
{#with相当于取别名,当变量名很长时,可以使用该方法#}
{% with user as ttt %}
<p>{{ user }}</p>
{% endwith %}
</body>
</html>
4.自定义标签过滤器
如果程序报错的话,重启一下django
在app里创建templatetags模块(模块名只能是templatetags)
在templatetags模块里创建任意一个py文件,例如mytag.py,在mytag.py中代码如下
from django.template import Library
from django.utils.safestring import mark_safe
register=Library() #register不能改名,只能用这个名字
#自定义过滤器
@register.filter()#name相当于别名,一般不写.is_safe一般不写,写了后模板会解析执行语句
def str_add(str1,str2):
return str1+str2
#自定义标签
@register.simple_tag()#
def add_nb(str):
return str+'nb'
@register.simple_tag(name='yyy')
def add_3(str1,str2,str3):
return str1+str2+str3
在templates中的html文件中代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板语言之变量</h1>
<p>{{ name }}</p>
<p>{{ age }}</p>
<p>{{ ll }}</p>
<p>{{ ll.0 }}</p>
<p>{{ dic }}</p>
<p>{{ dio.name }}</p>
<p>{{ A }}</p>
<p>{{ obj }}</p>
<p>{{ test }}</p>
<hr>
<h1>模板语言之过滤器</h1>
{#语法:{{ 第一个参数|过滤器名字:第二个参数 }},最多支持两个参数#}
{#常用过滤器#}
<p>统计字符串的长度:{{ name|length }}</p>
<p>统计列表的长度:{{ ll|length }}</p>
{#如果第一个参数值是false或者为空,使用给定的默认值,否则,使用变量的值#}
<p>过滤器之默认值:{{ ll2|default:'lqz' }}</p>
{#时间格式#}
<p>过滤器之date:{{ ctime|date:'Y-m-d' }}</p>
{#slice切割,区间前闭后开#}
<p>{{ ll|slice:'2:-1' }}</p>
{#truncatechars截断字符#}
<p>过滤器之truncatechars:{{ 'hnjskladjasl'|truncatechars:5 }}</p>
{#truncatecwords截断单词#}
<p>过滤器之truncatewords:{{ 'hello world nihao good help god '|truncatechars:5 }}</p>
{#过滤器之使用safe,会解析script语句,然后执行#}
{#<p>过滤器之用safe:{{ h1|safe }}</p>#}
{#过滤器之不用safe,不会解析script语句,所见即所得#}
<p>过滤器之不用safe:{{ h1 }}</p>
<hr>
<h1>模板语言之标签</h1>
{#{% for i in ll %}#}
{# 取出外层第几次循环#}
{# {% for person in person_list %}#}
{# {{ forloop.parentloop.counter }}#}
{# <p>{{ person }}</p>#}
{# {% endfor %}#}
{#{% endfor %}#}
{#循环的对象是空,才会走到empty#}
{#{% for foo in ll2 %}#}
{# <p>{{ foo }}</p>#}
{#{% empty %}#}
{# 傻屌#}
{#{% endfor %}#}
{#循环的是字典的value值#}
{#{% for v in dic.values %}#}
{# <p>{{ v }}</p>#}
{#{% endfor %}#}
{#循环的是字典的key:value值#}
{#{% for k,v in dic.items %}#}
{# <p>{{ k }}:{{ v }}</p>#}
{#{% endfor %}#}
{#{% if user %}#}
{# <a href="">退出</a>#}
{# {% else %}#}
{# <a href="">登录</a>#}
{# <a href="">注销</a>#}
{#{% endif %}#}
{#{% for l in ll %}#}
{# {% if forloop.first %}#}
{# <p>第一次的我</p>#}
{# {% elif forloop.last %}#}
{# <p>最后一次的我</p>#}
{# {% else %}#}
{# <p>{{ l }}</p>#}
{# {% endif %}#}
{#{% endfor %}#}
{#with相当于取别名,当变量名很长时,可以使用该方法#}
{% with user as ttt %}
<p>{{ user }}</p>
{% endwith %}
<hr>
<h1>自定义标签过滤器</h1>
<h4>使用自定义的过滤器</h4>
{% load mytag %}
<p>{{ 'lqz'|str_add:'nb' }}</p>
<h4>使用自定义的标签</h4>
{#有参数的直接在后面传参#}
<p>{% add_nb 'egon' %}</p>
<p>{% yyy 'alex' 'is' 'dsb' %}</p>
{#过滤器可以用于if判断,但是标签不行#}
{% if 'lqz'|str_add:'nb' %}
<p>肯定是True</p>
{% endif %}
{#标签用于if判断,直接报错#}
{#{% if add_nb 'egon' %}#}
{#<p>是真吗?</p>#}
{#{% endif %}#}
</body>
</html>
5.模板的导入
这是为了复用代码,提升开发效率。比如写了一个左侧样式,比较喜欢,想一直用,这样可以把样式存在left.html中
<div>
<div class="panel panel-default">
<div class="panel-heading">重金求子</div>
<div class="panel-body">
诱人少妇
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">澳门赌场</div>
<div class="panel-body">
在线发胖
</div>
</div>
</div>
这样,在test.html复用左侧样式时,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
<title>Title</title>
<style>
.head {
height: 60px;
background: #2e6da4;
}
</style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid">
<div class="row">
<div class="col-md-2">
{% include 'left.html' %}
</div>
<div class="col-md-9"></div>
</div>
</div>
</body>
</html>
主要是使用include,其实就是一句话,{% include ‘left.html’ %}
导入其实就是将一些会复用到的html代码保存到一个html文件中比如left.html中,复用时在其他html文件中include一下。
导入与继承的区别,导入是只是复用一部分样式,其他的是手写。而继承有母版,是复用整体样式,修改部分内容。
6.模板的继承
写一个母版,留一个可扩展的区域(盒子),可以留多个盒子(留的越多,可扩展性越高)
注意,所有的一切代码都要放在endblock之前,也就是盒子里面。每个盒子只能出现一次
使用{% extends ‘’base.html %}
如果要继承模板的内容,可以
{% block content1 %}
{{ block.super }}
{% endblock content1 %}
如果继承了多个盒子,在子版中,盒子的先后摆放顺序并不影响显示顺序。就像函数的查找过程一样,block content1,block content2在母版中已经定义好了
母版代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
<title>Title</title>
<style>
.head {
height: 60px;
background: #2e6da4;
}
</style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid">
<div class="row">
<div class="col-md-2">
{% include 'left.html' %}
</div>
<div class="col-md-9">
{% block content1 %}
<p>这是自定义区域</p>
{% endblock content1 %}
{% block content2 %}
<p>你养我啊</p>
<p>我养你啊</p>
<p>你还是先养你自己吧,傻瓜</p>
{% endblock content2 %}
</div>
</div>
</div>
</body>
</html>
导入的html代码如下
{% extends 'base.html' %}
{% block content1 %}
{# {{ block.super }}#}
<p>麻麻辣辣骨头汤</p>
<p>稀松平常干拌面</p>
{% block content2 %}
{{ block.super }}
{% endblock content2 %}
{% endblock content1 %}
7.静态文件配置
有3种静态文件配置方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
静态文件配置的三种方式
方式1:写死static
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
方式2:load static
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
方式3:load static
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
<title>Title</title>
</head>
<body>
<h1>测试</h1>
</body>
</html>
注意:导入jquery要先于导入bootstrap,因为bootstrap是需要jquery的支持的。
<script src="/static/jquery-3.3.1.js"></script>
8.设置当其他路由都不匹配时,返回404页面
url(r'',views.error)
9.inclusion_tag
多用于返回html的代码
先注册app
在app下创建一个templatetags的模块
在模块下新建一个py文件
from django.template import Library
register=Library() 名字必须叫register
使用装饰器:@register.inclusion_tag('test.html')
前端代码
<ul>
{% for s in ss %}
<li>{{ s }}</li>
{% endfor %}
</ul>
后台代码
from django.template import Library
register=Library()
@register.inclusion_tag('test.html')
def my_inclussion(key):
ll=['第%s页'%i for i in range(key)]
return {'ss':ll}
其实就相当于把动态html代码存进了自定义的函数中,然后用装饰器@register.inclusion_tag进行了装饰
使用。{% load mytag %}
{% my_inclusssion 10 %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
<title>Title</title>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
{% load mytag %}
{% my_inclussion 10 %}
</div>
</div>
</div>
</body>
</html>
ORM模板层的更多相关文章
- Django-5 模板层
Django 模板层 在之前的例子中,我们采用了硬编码的方式,来返回文本 def current_datetime(request): now = datetime.datetime.now() ht ...
- django学习笔记-模板层
模板层 将Python嵌入到HTML中. 模板简介 将HTML硬解码到视图并不是那么完美原因如下: 对页面设计时也需要对python代码进行相应的修改,模板可以不就行python代码修改的情况下变更设 ...
- django 实战篇之模板层
模板层 {{}} 变量相关 {%%} 逻辑相关 前端获取容器类型的数据统一使用 句点符(.) 两种给模板传递值的方式 return render(request,'index.html ...
- django——模板层
每一个Web框架都需要一种很便利的方法用于动态生成HTML页面. 最常见的做法是使用模板. 模板包含所需HTML页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分. 说白了,模板层就是 ...
- Django基础模板层(75-76)
Django框架之模板层(d75)一 模版语法之变量: ** locals() 会把*该*视图函数内的变量,传到模板 ** return render(request, 'index.html' ...
- Django 的路由层 视图层 模板层
--------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...
- DjangoMTV模型之视图层views及模板层template
Django视图层中views的内容 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容(render),也可以是一个重定向( ...
- python 全栈开发,Day69(Django的视图层,Django的模板层)
昨日内容回顾 相关命令: 1 创建项目 django-admin startproject 项目名称 2 创建应用 python manage.py startapp app名称 3 启动项目 pyt ...
- Django的模板层简介
Django的模板层 如果我们想要利用视图函数返回一个页面,一种比较简单的方式是利用HttpResponse()方法返回一个含有html内容的字符串: def current_datetime(req ...
随机推荐
- checkmysql.sh
#!/bin/sh # add by lxr MYSQL_SOCK="/tmp/mysql.sock" MYSQL_PWD="qq139547" ARGS=1 ...
- 用CSS里的 viewport-fit 标签应对iPhone X 的刘海
iPhone X 配备一个覆盖整个手机的全面屏,顶部的“刘海”为相机和其他组件留出了空间.然而结果就是会出现一些尴尬的情景:网站被限制在一个“安全区域”,在两侧边缘会出现白条儿.移除这个白条儿也不难, ...
- linux命令学习(5):pwd命令
Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...
- 10.15仿admin开发stark组件(一)
2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...
- day_5.28 py网络编程
端口 socket简介: socket为一个类 s接收的是返回的对象引用 2018-5-28 15:52:47 开始进行网络编程 udp 套接字 encode() 编码 decode() 解码 ' ...
- PAT甲级1055 The World's Richest【排序】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805421066272768 题意: 给定n个人的名字,年龄和身价. ...
- MySql数据库笔试题总结
数据库面试题94577265 1,设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号.姓名.工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER ...
- React组件中的key
React组件中的key 一.key的作用 react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给reac ...
- git add详解
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件. git add -u :他仅监控 ...
- 可执行代码(Executable Code)目标代码(object code)
小结: 1.可执行代码(Executable Code)是指将目标代码(object code)连接后形成的代码,简单来说是机器能够直接执行的代码. https://baike.baidu.com/i ...