模板层
模板语法传值
"""
{{}}:变量相关
{% %}:逻辑相关
"""
def test(request):
n = 123
f = 11.11
s = "奥特曼"
b = True
l = ["aoteman", "alterman"]
t = (111, 333, 222)
d= {"name": "tiga", "age": 18}
se = {"呵呵", "哈哈"}
def func():
return "aoteman123"
class MyClass(object):
def get_self(self):
return "self"
@staticmethod
def get_func():
return "func"
@classmethod
def get_class(cls):
return cls
obj = MyClass()
return render(request, "test.html", locals())
<p>{{ n }}</p>
<p>{{ f }}</p>
<p>{{ s }}</p>
<p>{{ b }}</p>
<p>{{ l }}</p>
<p>{{ d }}</p>
<p>{{ t }}</p>
<p>{{ se }}</p>
<p>传递函数名会自动加括号调用 但是模板语法不支持给函数传额外的参数{{ func }}</p>
<p>传类的时候也会自动加括号 但是模板语法不支持传参{{ MyClass }}</p>
<p>{{ obj }}</p>
<p>{{ obj.get_class }}</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_func }}</p>
<p>内部能够自动判断出当前的变量名是否可以加括号调用 如果可以就会自动执行 针对的是函数名和类名</p>
<p>{{ d.name }}</p>
<p>{{ l.0 }}</p>
模板语法过滤器(过滤器最多有两个参数)
{{数据|过滤器:参数}}
<h1>过滤器</h1>
<p>统计长度{{ s|length }}</p>
<p>默认值(第一个参数是 True 就展示第一个参数 否则展示冒号后面的值):{{ b|default:"什么也不是" }}</p>
<p>文件大小: {{ file_size|filesizeformat }}</p>
<p>日期格式化: {{ current_time|date:"Y-m-d H:i:s" }}</p>
<p>切片操作(支持步长):{{ l|slice:'0:1' }}</p>
<p>切去字符(包含三个点):{{ info|truncatechars:9 }}</p>
<p>切取单词(不包含三个点,按空格切取):{{ eng|truncatewords:9 }}</p>
<p>移除特定的字符:{{ eng|cut:" " }}</p>
<p>拼接操作:{{ l|join:"$" }}</p>
<p>拼接操作(加法):{{ n|add:10 }}</p>
<p>{{ hhh }}</p>
<p>取消转义:{{ hhh|safe }}</p>
from django.utils.safestring import mark_safe
res = mark_safe("<h1>123</h1>")
<p>{{ res }}</p>
"""
写全栈代码时 前端代码不一定要在前端页面书写
也可以先在后端写好 然后传输给前端页面
"""
标签
{% for foo in se %}
<p>{{ forloop }}</p>
{% endfor %}
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 2, 'revcounter0': 1, 'first': True, 'last': False}
{% if b %}
<p>dark</p>
{% elif True%}
<p>souls</p>
{% else %}
<p>sekiro</p>
{% endif %}
{% for foo in se %}
{% if forloop.first %}
<p>第一个</p>
{% elif forloop.last %}
<p>最后一个</p>
{% else %}
<p>算了吧</p>
{% endif %}
{% empty %}
<p>for 循环可迭代对象是空时,即内部没有元素</p>
{% endfor %}
{% for foo in d.keys %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %}
<p>{{ foo }}</p>
{% endfor %}
{% with t as %}
{% endwith %}
自定义标签、过滤器、inclusion_tag
"""
1. 在应用下创建一个名字必须叫(templatetags)文件夹
2. 在该文件夹内创建任意名称的 py 文件
3. 在该py文件内必须先书写下面两句话
from django import template
register = template.Library()
"""
@register.filter(name="aoteman")
def my_sum(v1, v2):
return v1+v2
<h1>自定义的使用(过滤器最多有两个参数)</h1>
{% load MyTag %}
<p>{{ n|aoteman:666 }}</p>
@register.simple_tag(name="plus")
def index(a,b,c,d):
return "%s-%s-%s-%s" % (a,b,c,d)
<h1>自定义标签的使用(可以有多个参数)</h1>
{% load MyTag %}
{% plus "1" "aoteman" "alterman" "2" %}
"""
内部原理
先定义一个方法
在页面上调用该方法 并且可以传值
该方法会生成一些数据然后传递给一个 html 页面
之后将渲染好的结构放到调用的位置
"""
@register.inclusion_tag(filename="menu.html")
def left(n):
data = ["第{}项".format(i) for i in range(n)]
return locals()
<ul>
{% for foo in data %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
<h1>自定义 inclusion_tag 的使用</h1>
{% load MyTag %}
{% left 10 %}
模板的继承
"""
网站页面布局类似,只是某些局部在变化
"""
{% block content %}
{% endbloack %}
{% extends "home.html" %}
{% block content %}
子版内容
子版内容除了可以自己写自己的之外 还可以继续使用模板的内容
{{ block.super }}
{% endblock %}
1. CSS 区域
2. html 区域
3. JS 区域
模板的导入
"""
将页面的某一个局部当成模块的形式
哪个地方需要就可以直接导入使用即可
"""
{% include "wasai.html" %}