Django 之 模板系统css
Django相关语法,记住以下两种特殊符号:html
{{变量名}} 变量名由字母数字和下划线组成python
点 (.)用来获取对象的相应属性值django
例子:安全
viewapp
class Person(): def __init__(self, name, age): self.name = name self.age = age def talk(self): return '生活静好,不存在的' def __str__(self): return "<Person {} - {}>".format(self.name, self.age) def temp(request): string = '微分,微分,你学会了吗,better,better' age = 12 name_list = ['思域', '图灵', '清然', '柳眉', '雷岩', '浩瀚'] mei_dict = { 'name': '雷岩', 'hobby': 'dance', 'gender': '女', 'keys': '斯菲斯非,虚无缥缈' } now = datetime.datetime.now() p1 = Person('xinxin', 12) return render(request, 'temp.html', { 'string': string, 'age': age, 'name_list': name_list, 'mei_dict': mei_dict, 'l1': [1, 2, 3, 4], 'l2': [5, 6, 7, 8], 'p1': p1, 'kong': [], 'num': 'x1', } )
模板中函数
<h1>{{ string}}</h1> {# 取name_list中的第一个值 #} <h1>{{ name_list.0 }}</h1> {# 取字典中key = name的value值 #} <h1>{{ mei_dict.name }}</h1> {# 取字典中的全部key值,若keys也为key,则取的是keys对应的value值 #} <h1>{{ mei_dict.keys}}</h1> {# 取字典中全部的value值 #} <h1>{{ mei_dict.values }}</h1> {# #} <h1>{{ mei_dict.items }}</h1> {# 取对象name的属性 #} <h1>{{ p1.name }}</h1> {# 取对象 #} <h1>{{ p1 }}</h1> {# .点操做只能调用不带参数的方法 #} <h1>{{ p1.talk }}</h1>
注:当模板遇到一个(.)的时候,会按照以下顺序去查询:oop
一、在字典中查询网站
二、属性或者方法ui
三、数字索引
过滤器是用来修改变量展现的结果
语法:{{value|filter_name:参数}}
{{value|default:"nothing"}}
若是value没有传值的话就显示nothing
注:TEMPLATES的OPTIONS能够增长一个选项:string_if_invalid:'找不到',能够替代default的做用
将值转化为一我的类可读的文件尺寸,最大到PB
{{filesize|filesizeformat}}
给变量加参数,若都为字符串则链接
{{value|add:'2'}}
{#如果列表,则把两个列表合为一个列表#} {{l1|add:'l2'}}
若是字符串多余指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{value|truncatechars:8}}
日期格式化
{{value|date:'Y-m-d H:i:s'}}
也可在settings中固定日期的格式
# settings 中配置 USE_L10N = False DATETIME_FORMAT = 'Y-m-d H:i:s'
Django中的模板为了安全,会对HTML和JS等语法标签进行自动转义,可是有的时候,咱们并不但愿这些内容被转义,这个时候就能够经过过滤器|safe的方式告诉django这段代码是安全的没必要转义
{{value|safe}}
官网
https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#built-in-filter-reference
一、在app下建立一个名为templatetags的python包 ,文件名是固定的,不能改
二、在包内建立py文件 ---my_tags.py
三、在py文件中写入:
from django import template
register = template.Library() # register 是固定的
四、写函数加装饰器
@register.filter def add_str(value, arg=None): # 函数名就是过滤器的名字,value变量 arg给变量添加额外的参数 ret = '{}__{}'.format(value,arg) return ret
五、使用
{%load my_tags%} # 导入文件 {{'zhouyou'|add_str:'zhengxing'}}
<ul> {% for book in book_list%} <li>{{book.name}}</li> {%endfor%} </ul>
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒叙索引值(从1开始)
forloop.revcounter0 当前循环的倒叙索引值(从0开始)
forloop.first 当前循环是否是第一次循环(布尔值)
forloop.last 当前循环是否是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环
<ul> {% for book in book_list%} <li>{{book.name}}</li> {% empty %} <span>空的</span> {%endfor%} </ul>
{% if book_list%} 书籍数:{{book_list|length}} {% elif book_em%} 情感类:{{book_em|length}} {% else %} 没有书籍 {% end if%}
注:
一、条件不支持 5 > 3 >2 的连续判断 False
二、支持为and,or, == , >,<,>= ,<=,is,is not,in, not in
三、不支持算术运算
为避免文件路径变化而找不到静态文件,用别名
首先配置settings
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]
使用
{% load static%} {% static '静态文件路径'%} # 完整的静态文件路径 {% get_static_prefix%} #静态文件的别名
{% load static%} <img src="{% get_static_prefix%}images/hi.jpg" alt="Hi!"/>
或者
{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX}}images/hi.jpg" alt="Hi!" /> <img src="{{STATIC_PREFIX}}IMAGES.hi2.jpg" alt="Hello!" />
母版:
就是普通的HTML,提取了多个页面的公共部分
定义一些block块,让子页面从新覆盖 {% block 名字%} {% endblock %}
在母板中写block块
{% block content%} {% endblock%} {% block js%}{%endblock%} {% block css%}{%endblock%}
在子板中继承
{% extends '母板的名称'%} {% block content %} 重写block块 {% endblock%}
注意:
一、{% extends '母版的名称'%} 写在第一行,前面不能有内容
二、{% extends ’母版的名称‘%} 模板的文件名引号要带上,否则会看成变量查找
三、要显示的内容放在block块中,其余部分不显示
四、模板中定义多个block块,通常写上css,js
csrf(Cross-site request forgery)
跨站请求伪造:对网站的恶意利用
将经常使用的页面北荣如导航条,页尾信息等组件保存在单独的文件中,而后在须要使用的地方导入
{% include 'navbar.html'%}
和自定义filter相似,只不过接收更灵活的参数。
定义注册simple_tag
@register.simple+tag(name="plus) def plus(a,b,c): return "{} + {} + {}".format(a,b,c)
使用自定义simple_tag
{% load app01_demo%} {% plus "1" "2" "abc" %}
多用于返回HTML代码段
步骤:
一、在app下建一个templatetags的python文件包(文件名固定)
二、在templatetags下创建一个py文件, (my_tags)
三、my_tags.py
from django import template register = template.Library() @register.inclusion_tag('模板的文件名称(result.html)') def show_results(n): num=1 if num<1 else int(num) data = ["第{}页".format(i) for i in range(1,n+1)] return {"data":data}
四、result.html
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
五、使用
{% load my_inclusion %} {% show_results 10 %}