模板语法

模板语法

CBV源码剖析

#FBV和CBV
'''
他们两个都是出现在视图函数views中的,视图函数没必要必须是函数,也可以是一个类,当我们定义一个类的时候就是CBV了,CBV下是通过在类内部定义请求方式的同名函数来进行不同的操作的。
通过对源码的查看,可以看出其实本质上CBV也是FBV。当请求来的时候会去判断请求的方式,利用反射去执行定义的相应函数。
'''
# CBV的使用方式:
from django.views import View  # 首先需要导入对应的模块
url(r'^index/', views.MyCBV.as_view()) # as_view()是一个闭包函数

'''
在django启动的时候,带括号就会自动触发执行,as_view()返回其本身内部定义的一个view函数的内存地址,当匹配到路由的时候,就会执行该函数,函数内部的本质就是判断请求的方式,然后反射到类创建的对象来执行。
'''

看源码谨记:

  1. 先从对象自己找,再从产生对象的类中找,之后再去父类中找。
  2. 看源码看到了self,要知道该self传的是什么东东。

模板语法传值

整理出的规则:

  1. {{ }}:在前端中一般使用是变量相关
  2. {% %}:逻辑相关

基本上所有的数据类型都可以传前端,在前端都可以直接使用{{}}来进行使用,容器类型都只能使用点的方式进行 ,同时还可以使用点索引的方式,两者还可以混用。

传递函数名会自动加括号调用,不过不支持函数传参数。传类名的时候也会自动加括号调用进行实例化。

过滤器

过滤器就类似于是模板语法内置的内置语法,最多只能有两个参数。

# 基本语法
{{ 数据|过滤器:参数}}

# 在写前端项目的时候,部分前端代码可以经由后段代码传到前端并进行解析。
|safe  # 告诉前端这是安全的,然后会解析

# 在后端向前端传需要导入模块
from gjango.utils.safestring import mark_safe
res = mark_safe('前端代码字符串') 

统计长度:{{ s|length }}
默认值:{{ s|default:'前面的false才会显示我' }}
文件大小:{{ f|filesizeformat }}
日期格式化:{{ time|date:'Y-m-d' }}
切片操作(支持步长):{{ l|slice:'0:5:2' }}
切取字符:{{ info|truncatechars:9 }}
切取单词(按照空格进行切):{{ msg|truncatewords:9 }}
移除特定的字符:{{ msg|cut:'A' }}
拼接操作(可进行数字或者字符串):{{ n|add:10 }}
转义:{{ hhh|safe }}
转义:{{ res }}

标签

# for 循环
{% for foo in l %}
	<p>{{ forloop }}</p>
	{% empty %}
    	l是空的时候执行的标签
{% endfor %}

# if判断
{% if a %}
	标签体
{% elif s %}
	标签体
{% else s %}
	标签体
{% endif %}


# with起别名

{% with xxx as ooo %}
	在这个内部就可以通过别名快速获取前面的xxx
{% endwith %}

自定义过滤器、标签和inclusion_tag

'''
首先进行三步:
	1. 在应用下创建一个名字叫templatetags文件夹
	2. 在该文件夹新爱创建任意名称的py文件
	3. 在py文件中必须书写下面两句话:
		from django import template
		register = template.Library()

接下来就可以进行自定义了
'''
@register.filter(name='过滤器名字')
def my_tag(a):
    return XXX

{% load py文件 %}

{{ s|过滤器名字}}


# 自定义标签(参数可以有多个)  相当于函数
@register.simple_tag(name='标签名')
def index(a,b):
    return '1,2,3'
 
使用{% 标签名 参数 %}  # 多个参数之间使用空格


# 自定义 inclusion_tag
'''
在html页面的某一个地方的页面需要传参数才能渲染出来,并且在多个页面都要使用,那么就可以考虑将该局部页面做成inclusion_tag形式
其原理就是先定义一个方法,在页面上调用该方法并传值,该方法会传一些数据给html页面,然后将渲染好的结果放到调用的位置
'''
@register.inclusion_tag('html页面')
def left(n):
    data = XXX
    return locals()  # 推荐是想用这一种
	return {'data':data}

{% left 5 %}  # 使用

模板的继承

当某些页面只需要局部进行更改而整体不会进行改变的时候,就可以使用模板的继承

步骤如下:

  1. 创建一个html文件,将之全部内容删除。

  2.   模板内容
    

    {% endblock%}

    在模板页面找到需要进行修改的内容

  3. 在子页面对区域进行更改

    {% block content %}

      子页面内容
    

一般情况新爱模板页面应该至少有三块被修改的区域

  1. css区域
  2. html区域
  3. js区域
{% block css %}
{% endblock %}
  

{% block content %}
{% endblock %}
  
{% block js %}
{% endblock %}

模块的导入

加入某一个局部使用较多的话 可以当做模块进行导入

{% incluse '模块文件' %}
posted @ 2020-05-28 16:38  小菜鸟是我  阅读(631)  评论(0编辑  收藏  举报