本文共 5789 字,大约阅读时间需要 19 分钟。
声明:部分信息来源这篇博客https://www.cnblogs.com/maple-shaw/articles/9333821.html
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的时候调用Model和Template此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
Django框架图示
只有两种特殊符号
{ {变量}}{% 逻辑 %}如for循环等
注意:当模板系统遇到一个(.)时,会按照如下的顺序去查询:
django官方文档
django过滤器官方文档1
用来修改变量在html的显示结果
语法
语法: { { 变量(或者字符串等等)|方法名:参数 }}#:前后不可以有空格default默认值过滤器{ { 变量|default:"nothing"}}#如果value值没传的话就显示设置的默认值nothing注:在setting.py中TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。filesizeformat文件尺寸过滤器{ { 变量|filesizeformat }}#将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等),最大支持单位pBadd{ { 变量|add:"2" }}#给变量加参数,相当于py中的加号,可以数字运算,字符串拼接,列表拼接lower{ { 变量|lower }}#小写upper{ { 变量|upper}}#大写title{ { 变量|title }}#标题ljust{ { 变量|ljust:"10" }}#左对齐rjust{ { 变量|rjust:"10" }}#右对齐center{ { 变量|center:"15" }}#居中length{ { 变量|length }}#变量长度slice{ {变量|slice:"2:-1"}}#切片first{ { 变量|first }}#取第一个元素last{ { 变量|last }}#取最后一个元素join{ { 变量|join:" // " }}#使用字符串拼接列表。同python的str.join(list)。truncatechars{ { 变量|truncatechars:9}}#如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。date{ { 变量|date:"Y-m-d H:i:s"}}#日期格式化safe假如value = "点我"{ { 变量|safe}}#Django的模板为了安全会对HTML标签和JS等语法标签进行自动转义,safe能取消django的转义{% widthratio 100; 1 100%}#先除后乘,需要三个参数
在app下创建一个名为templatetags的python包;
在python中创建py文件,文件名自定义(my_tags.py);
在my_tags.py文件中配置
from django import template#导入模块register = template.Library() #标准语句都不能改#写函数装饰器@register.filterdef add_xx(value, arg): # 最多有两个return '{}-{}'.format(value, arg)#返回两个值的拼接#在html使用方式{% load my_tags %}#引用模块{ { 'alex'|add_xx:'dsb' }}#通过函数名使用@register.filter(name = xxx)#可以直接通过name等于的xxx取引用def add_xx(value, arg): # 最多有两个return '{}-{}'.format(value, arg)#返回两个值的拼接#在html使用方式{% load my_tags %}#引用模块{ {'alex'|xxx:'dsb'}}#通过赋值的name引用
自定义过滤器只是带有一个或两个参数的Python函数:
for语法
Variable | Description |
---|---|
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(到1结束) |
forloop.revcounter0 | 当前循环的倒序索引值(到0结束) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
for... empty
{% for book in all_books %} ..... {% empty %} 没有相关的数据{% endfor %}
dango的if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
django的if与python的区别
python 10>5>1 --> 10>5 and 5>1 true django 10>5>1 --> 10>5 --> true --> 1>1 false
模板的if&elif&else实例
{% if user_list %}用户人数:{ { user_list|length }}{% elif black_list %}黑名单数:{ { black_list|length }}{% else %}没有用户{% endif %}
with定义一个中间变量,在django模板中有些值,需要多次使用,我们就可以通过with定义变量,方便使用
{% with total=business.employees.count %}{#将business.employees.count值定义为total可以在语句内使用#} { { total }} employee{ { total|pluralize }}{% endwith %}{#结束with语句#}
csrf_token标签用于跨站请求伪造保护。(django的保护机制为了防止post请求是从其他端发送来的,需要一个认证,直接发送,会报403错误,加入这个标签代表加入了认证方法,就能够在django中发送post请求了)
在页面的form表单里面写上{% csrf_token %}
{# 注释内容 #}
{#注释内容#}单行注释,多行就是多敲几遍
注意事项:
Django的模板语言不支持连续判断,即不支持以下写法:
{% if 10 > 5 > 1 %}...{% endif %}
{ { data.items }}
注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
子页面继承母版,方便使用母版的样式
{% extends '母板.html' %}{#输入这个语句就可以继承母版.html的样式 #}{#通过在母板中使用{% block xxx %}来定义"块"。在子页面中通过定义母板中的block名来对应替换母板中相应的内容。如果不在定义的块中则不会出现效果#}注意在母版中需要定义一个块,子网页的中数据写一个块,名称要与母版的块名相同才能替换{#实例,下面就是我们在继承母版的子页面,定义的块中,输入几条语句#}{% block page-main %}世情薄
人情恶
雨送黄昏花易落
{% endblock %}
组件与母版类似,不同的是,母版比较大,不经常变动,而在网页中我们有些是需要灵活变动的,这时候我们就需要组件来帮忙了,组件本质也是继承一个文件,不同的是组件是较少代码的继承
继承组件语法
{% include '组件.html' %}
在我们一般时候中,需要对静态文件设置一个别名,才可以使用静态文件中的文件等,可如果出现,别名被改动,我们就需要去html中一个个修改文件导入的名称,这样不够,于是django替我们想到了这个情况,我们可以通过下面几种模板标签方式,避免这种问题
方式一{% load static %}{#导入static方法#} {#{% static "images/hi.jpg" %}中的static代表着我们的静态文件别名,可以随着我们的修改动态的变化#}方式二{#使用get_static_prefix#}{% load static %}{#get_static_prefix代表当前的静态文件别名,与路径拼接即可,不过不如方式一方便,不经常使用#}
和自定义filter类似,只不过能够接收更灵活的参数。
实例定义注册simple tag@register.simple_tag(name="plus")def plus(a, b, c): return "{} + {} + {}".format(a, b, c)#将传进来的参数进行拼接返回在模板中使用{% load app01_demo %}{% plus "1" "2" "abc" %}
在网页中我们模板有些样式是需要跟着服务端的数据,灵活变动的,这时我们就需要通过服务端动态的给模板返回html代码,这种方式就是inclusion_tag
动态返回分页数实例:
{% load my_tags %}{% page 2 %}{#使用inclusion_tag#}
@register.inclusion_tag('page.html')#返回值返回的页面def page(num): return {'num': range(1, num + 1)}#返回的数据
好了,django模板的东西就说到这了,其他没有说到或遗漏的的,博客内有django的官网,大家可以去官网具体了解学习
转载于:https://blog.51cto.com/11985686/2411148