Django 之 模板系统

Django  之  模板系统css

  一、语法

Django相关语法,记住以下两种特殊符号:html

1.一、{{ }} 变量相关,在模板渲染的时候替换成值
1.2 {% %} 逻辑相关的操做

  二、变量

{{变量名}} 变量名由字母数字和下划线组成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

三、数字索引

 

  三、Filters(过滤器)

过滤器是用来修改变量展现的结果

语法:{{value|filter_name:参数}}

default
{{value|default:"nothing"}}

 

若是value没有传值的话就显示nothing

注:TEMPLATES的OPTIONS能够增长一个选项:string_if_invalid:'找不到',能够替代default的做用

filesizeformat

将值转化为一我的类可读的文件尺寸,最大到PB

{{filesize|filesizeformat}} 
add

给变量加参数,若都为字符串则链接

{{value|add:'2'}}
{#如果列表,则把两个列表合为一个列表#}
{{l1|add:'l2'}}

  

truncatechars

若是字符串多余指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数:截断的字符数

{{value|truncatechars:8}}  
date

日期格式化

{{value|date:'Y-m-d H:i:s'}}

 也可在settings中固定日期的格式

 

# settings 中配置 
USE_L10N = False
DATETIME_FORMAT = 'Y-m-d H:i:s'
safe

Django中的模板为了安全,会对HTML和JS等语法标签进行自动转义,可是有的时候,咱们并不但愿这些内容被转义,这个时候就能够经过过滤器|safe的方式告诉django这段代码是安全的没必要转义

{{value|safe}}

官网

https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#built-in-filter-reference

 

  自定义filter

步骤:

一、在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'}}

  标签tags

for
<ul> {% for book in book_list%} <li>{{book.name}}</li> {%endfor%} </ul>
for 循环可用的一些参数:

forloop.counter 当前循环的索引值(从1开始)

forloop.counter0 当前循环的索引值(从0开始)

forloop.revcounter 当前循环的倒叙索引值(从1开始)

forloop.revcounter0 当前循环的倒叙索引值(从0开始)

forloop.first 当前循环是否是第一次循环(布尔值)

forloop.last 当前循环是否是最后一次循环(布尔值)

forloop.parentloop 本层循环的外层循环

empty  
<ul> {% for book in book_list%} <li>{{book.name}}</li> {% empty %} <span>空的</span> {%endfor%} </ul>
if elif else
{% 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

三、不支持算术运算

 

  静态文件 static

为避免文件路径变化而找不到静态文件,用别名

 

首先配置settings

STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]

使用

{% load static%} {% static '静态文件路径'%} # 完整的静态文件路径 {% get_static_prefix%} #静态文件的别名

使用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_token

csrf(Cross-site request forgery)

跨站请求伪造:对网站的恶意利用

  组件

将经常使用的页面北荣如导航条,页尾信息等组件保存在单独的文件中,而后在须要使用的地方导入

{% include 'navbar.html'%}

  自定义simpletag

和自定义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" %}

  inclusion_tag

多用于返回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 %}
相关文章
相关标签/搜索