- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Django模板不会?点进来,总结了模板语法传值取值、过滤器和自定义过滤器、模板标签的分类、中间件403报错如何解决、如何继承模板~👆
键值对形式:{‘name’:value}
精准传值,用啥传啥
函数:locals()
locals()
将当前名称空间中所有的变量名全部传递给页面
{{变量名}}
{% 表达式 %}
* 传递函数名会自动加括号调用,并返回return后的值
* 传递类名会自动加括号调用实例化成对象
* 传递实例化对象名也返回对象,传递 对象.方法 可以获取该的返回值
* 传递类和函数不需要加括号,自动加括号调用,模板语法不支持额外的传参(形参,实参)
* HTML页面取值可以通过点`.`的方式取值,不论是索引还是键值等···
eg:<p>{{ d.hobby.3.username }}</p>
# 索引就是.下标,字典就是.键
<p>{{ my_int }}</p>
<p>{{ my_float }}</p>
<p>{{ my_list }}</p>
<p>{{ my_tuple }}</p>
<p>{{ my_dict }}</p>
<p>{{ my_set }}</p>
<p>{{ my_bool }}</p>
<p>{{ get_func }}</p>
<p>{{ MyClass }}</p>
<p>{{ obj.get_cls }}</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_static }}</p>
def func(request):
my_int = 123
my_float = 3.14
my_list = [1, 2, 3, 4]
my_tuple = (1, 2, 3, 4,)
my_dict = {'name': 'Hammer'}
my_set = {1, 2, 3, 4}
my_bool = True
def get_func():
print('from get_func')
return 'get_func'
class MyClass(object):
def get_self(self):
return '绑定给对象的方法'
@classmethod
def get_cls(cls):
return '绑定给类的方法'
@staticmethod
def get_static():
return '静态方法'
obj = MyClass()
return render(request,'func.html',locals())
模板语法:{{ 变量名 | 过滤器:可选参数 }}
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:
{{ name|lower }}
# 过滤器处理后转小写
管道符的作用:一个过滤器管道的输出又可以作为下一个管道的输入
在html文件中,default 为变量提供一个默认值,如果views传的变量布尔值为false,则使用指定的默认值,如果为true,就使用views传的变量值;
from django.shortcuts import render
def func(request):
id = 0
return render(request,'func.html',locals()) # {'id':id}
'''html'''
<p>{{ id|default:'views传的变量布尔值为false用我吧!' }}</p>
字符串:{{ my_str|length }}
列表:{{ my_list|length }}
字典:{{ my_dict|length }}
集合:{{ my_set|length }}
def func(request):
my_str = 'HammerZe'
my_list = [1, 2, 3, 4]
my_dict = {'name': 'HammerZe', 'age': 18}
my_set = {1, 1, 2, 2, 3, 3, 4, 4}
return render(request, 'func.html', locals())
以更易读的方式显示文件的大小(即'13 KB', '4.1 MB', '102 bytes'等)
字典返回的是键值对的数量,集合返回的是去重后的长度
def func(request):
file_data = 1024*1024
return render(request, 'func.html', locals())
文件大小:{{ file_data|filesizeformat }}
根据给定格式对一个日期变量进行格式化。
格式 Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间
def func(request):
import datetime
ctime = datetime.datetime.now()
return render(request, 'func.html', locals())
时间:{{ ctime|date:'Y-m-d H:i:s' }}
如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分
截断的字符串将以 ... 结尾,...
也算三个字符,比如博客园首页示例
def func(request):
trun_str = 'HammerZe真帅'
return render(request, 'func.html', locals())
字符串截取:{{ trun_str|truncatechars:9 }}
该过滤器和truncatechars
类似,但是...
不计入长度,空格为分隔符,一个单词为一个单元字符
from django.shortcuts import render
def func(request):
trun_str = 'HammerZe Hans He'
return render(request, 'func.html', locals())
字符串截取:{{ trun_str|truncatewords:2 }}
将字符串标记为安全,不需要转义。
前端:要保证 views.py 传过来的数据绝对安全,才能用 safe。
后端: 使用views.py 的 mark_safe 效果相同
Django 会自动对 views.py 传到HTML文件中的标签语法进行转义,令其语义失效。加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效(这里涉及到xss攻击自行查阅)
from django.shortcuts import render
def func(request):
unsafe_str = '<h1>不转义,语义失效,携带标签</h1>'
safe_str = '<h1>转义,语义生效,我是一级标题</h1>'
# 后端取消转义
from django.utils.safestring import mark_safe
safe_str1 = mark_safe('<h1>后端取消转义</h1>')
return render(request, 'func.html', locals())
{{ unsafe_str }}
{{ safe_str|safe }}
{{ safe_str1 }}
整型做加法运算,字符串做拼接
from django.shortcuts import render
def func(request):
add_num = 100
join_str = 'Hammer'
return render(request, 'func.html', locals())
<p>加法运算:{{ add_num|add:100 }}</p>
<p>字符串拼接:{{ join_str|add:'Ze' }}</p>
Django 注释使用 {# #}
{# 这是一个注释 #}
{% if condition %}
... display
{% endif %}
或者
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
# 示例
{% if my_str %}
{{ my_str }}
{% endif %}
def func(request):
my_str = 'HammerZe'
return render(request, 'func.html', locals())
# 页面返回:HammerZe
{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:
{% if a and b %}
a 和 b 变量都是可用的。
{% endif %}
每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容;
模板语法for循环和python 的for循环类似,支持in
from django.shortcuts import render
def func(request):
l = [1,2,3,4]
return render(request, 'func.html', locals())
{% for foo in l %}
{{ foo }}
{% endfor %}
给标签增加一个 reversed
使得该列表被反向迭代
{% for foo in l reversed %}
{{ foo }}
{% endfor %}
遍历字典: 可以直接用字典 .items 方法,用变量的解包分别获取键和值
from django.shortcuts import render
def func(request):
my_dict = {'name': 'HammerZe', 'age': 18, 'gender': 'male'}
return render(request, 'func.html', locals())
# 分别获取k,v
{% for k in my_dict %}
{{ k }}
{#{{ v }}#}
{% endfor %}
# 获取k,v
{% for k,v in my_dict.items %}
{{ k }}
{{ v }}
{% endfor %}
{% for k in my_dict %}
{{ forloop }}
{% endfor %}
在 {% for %} 标签里可以通过 {{forloop}} 变量获取循环序号。
{% for i in views_list %}
{#<p>{{ forloop.counter }}</p>#} # 1 2 3 4 5
{#<p>{{ forloop.counter0 }}</p>#} # 0 1 2 3 4
{#<p>{{ forloop.revcounter }}</p>#} # 5 4 3 2 1
{#<p>{{ forloop.revcounter0 }}</p>#} # 4 3 2 1 0
<p>{{ forloop.first }}</p> # True False False False False
<p>{{ forloop.last }}</p> # False False False False True
{% endfor %}
from django.shortcuts import render
def func(request):
views_list = ["a", "b", "c", "d", "e"]
return render(request, 'func.html', locals())
{% empty %} 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )
{% for i in views_list %}}}
{{ i }}
{% empty %}
空列表当然执行~
{% endfor %}
{% include %} 标签允许在模板中包含其它的模板的内容,类似后端导入模块
{% include 'func2.html'%}
# func2.html
<h1>哈哈哈</h1>
作用:跨站请求伪造保护。
在我们使用form表单的时候,经常报403权限错误,这里我们可以在HTML页面使用{% csrf_token %}
,表单提交数据才会成功,或者在settings.py将中间件注释掉也可以;
解析:
首先,向服务器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。
然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。
1、在应用目录下创建 templatetags 目录名只能是 templatetags;
2、在 templatetags 目录下创建任意 py 文件,如:my_tag.py。
3、my_tag.py 文件代码如下:
from django import template
register = template.Library() #register的名字是固定的,不可改变
4、利用装饰器 @register.filter
自定义过滤器
注意:自定义过滤器也只能接收两个参数,因为|
本质就是前面的参数交给后面过滤器处理,过滤器最强多可自带一个参数
'''my_tag.py'''
# 自定义过滤器
@register.filter(name='myfilter')
def index(x,y):
return x * y
'''views.py'''
from django.shortcuts import render
def func(request):
a=10
return render(request, 'func.html', locals())
{#加载过滤器#}
{% load my_tag %}
{#使用过滤器#}
{{ a|myfilter:10 }}
5、自定义标签
@register.simple_tag(name='mytag')
def tag(x, y, z): # 自定义标签可以接收n个参数
return x + y + z
{#加载过滤器#}
{% load my_tag %}
{% mytag 1 2 3 %}
类似将html页面功能分块返回了~
自定义inclusion_tag,my_tag.py
from django import template
register = template.Library() # register的名字是固定的,不可改变
@register.inclusion_tag('login.html',name='my_inclusion')
def inclusion(n):
l = []
for i in range(1,n):
l.append(f'第{i}页')
return locals() # 将当前名称空间所有名字返回给login.html
views.py
def func(request):
return render(request, 'func.html', locals())
lit.py 中间html
<ul>
{% for foo in l %}
<li>{{ foo}}</li>
{% endfor %}
</ul>
func.html
{#加载过滤器#}
{% load my_tag %}
{#生成10个li#}
{% my_inclusion 10 %}
模板可以用继承的方式来实现复用,减少冗余内容。
网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。
父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。
标签 block...endblock: 父模板中的预留区域,该区域留给子模板填充差异性的内容,不同预留区域名字不能相同
{% block 名称 %}
预留给子模板的区域,可以设置设置默认内容
{% endblock 名称 %}
子模板使用标签 extends 继承父模板:
{% extends "父模板路径"%}
子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,当然也可以都不设置,就为空。
子模板设置父模板预留区域的内容:
{% block 名称 %}
子内容
{% endblock 名称 %}
子版也可以继续使用母版划定区域内的内容
{{ block.super }}
划定区域的时候一般都应该有三个区域:CSS区域,HTML文档区域、JS区域
这样划分区域提高了页面的可扩展性和方便维护等优点
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
namespace std { template <> class hash{ public : size_t operator()( cons
我正在构建一个 Javascript 交互性有限的 Django 应用程序,并且正在研究如何将 Vue 模板与 Django 模板合并以实现相同的内容。 想象一个无限滚动的页面,其中 SEO 非常重要
我需要一个由游戏逻辑组成的外部类,调用 LitElement 组件,并向其传递一个 html 模板文字,该组件将使用该文字来更新其自己的 html 模板文字的一部分。 在下面的代码中,您将看到组件的一
很简单,我不想在 html 文件中定义所有 Handlebars 模板 我试过了 但这并没有奏效。我是否可以不以编程方式定义模板,甚至只是加载 Handlebars 文件,以便我可以重用,而且我觉得
在此代码中,j 正确地成为对象:j.name、j.addr、j.city、j.state 和 j.zip。但是,成功函数有一个 JavaScript 错误 .tmpl() 不是函数。 {{t
Django模板不会?点进来,总结了模板语法传值取值、过滤器和自定义过滤器、模板标签的分类、中间件403报错如何解决、如何继承模板~👆 Django 模板 模板传值取值 后端传值 键值对形式:{‘n
哈喽大家好,我是鹿 九 丸 \color{red}{鹿九丸}鹿九丸,今天给大家带来的是C++模板。 如果大家在看我的博客的过程中或者学习的过程中以及在学习方向上有什么问题或者想跟我交流的话可以加我的企
我正在用 PHP 编写一个简单的模板层,但我遇到了一些困难。目前它是这样工作的: 首先,我使用 fetch_template 从数据库中加载模板内容 - 这可行(如果您有兴趣,我会在启动时收集所有模板
我正在制作有关模板的 Django 教程。我目前处于此代码: from django.template import Template, Context >>> person = {'name': '
我正在使用 Jquery 模板来显示传入的 JSON 数据我想将模板加载到可缓存的外部文件中。我该怎么做? 更新 http://encosia.com/2010/12/02/jquery-templa
这是我的观点.py: from django.http import HttpResponse from django.template.loader import get_template from
我试图说服一位同事在项目的前端使用 Mustache/Hogan,我提出了以下建议: 有一个 templates.js 文件,大致如下所示: var tpl_alert = '{{msg}}'; va
我想创建一个通用的数组函数。在我的 API 中,我有一个通用容器,我需要将其转换为正确的类,但我想让它通用 template void UT::printArray(CCArray* arr, T t
有谁知道是否有办法在 Genshi 中创建 javascript 模板?我的意思是,我需要一个 .js 文件,可以在其中使用 等指令。等等。 有什么想法吗?谢谢! 最佳答案 你可以直接在html中这
我想知道是否可以设置某种 HTML 模板系统,基本上我有 3 个不同的文件: - header.html - footer.html - landing.html(landing.html 是包含页面
我正在尝试构建以下 HTML 模板: 这很简单,如果我使用红色容器 1-4,语法如下: 1 2 3 4 5 6 7 8 9 https://jsfi
#include "boost/numeric/ublas/matrix.hpp" using namespace boost::numeric::ublas; template class Lay
我在一个类中有一个函数,它传递了一个函数及其参数,然后将它们绑定(bind)到一个函数调用中并调用该函数等。 这已经被快速组合在一起以测试我知道代码不是很好的概念。 class Profiling {
是否有一个 c++ 结构或模板(在任何库中)允许我在十进制和任何其他基数之间进行转换(很像 bitset 可以做的)? 最佳答案 是的,你可以使用unsigned int: unsigned int
来自其他编程语言,许多像我一样的人会感到惊讶。我有一个简单的问题。我有一个列表——比如说,用户。我想遍历用户并显示一些信息。非常简单,直到我被这个难住了: 使用一个 eex 模板,我试图这样做:
我是一名优秀的程序员,十分优秀!