一、模板由 html代码+逻辑控制代码 组成

二、逻辑控制代码的组成

1、变量(使用双大括号来引用变量)

  语法格式:{{ var_name }}

-----------------------Template和Context对象

(venv) C:\Users\Lowry\PycharmProjects\django_template>python manage.py shell
>>> from django.template import Context,Template
>>> t=Template("my name is {{name}}") #逻辑控制代码一定要写在引号里面
>>> c=Context({'name':"alex"})
>>> t.render(c)
'my name is alex' #同一模板多个上下文
1、多次创建模板
>>> for name in ("john","julie","pat"):
... t=Template("hello,{{name}}") #缩进必须要有
... print(t.render(Context({"name":name})))
...
hello,john
hello,julie
hello,pat 2、一次创建多次渲染
>>> t=Template("my name is {{name}}")
>>> for name in ("john","alex","kobe"):
... print(t.render(Context({"name":name})))
...
my name is john
my name is alex
my name is kobe

----------------------------万能句点号,用于特殊变量的取值。点后面接的是对象的属性,这个要和filter的方法区分开。

-----------------------views
import datetime def index(request):
obj="alex"
s=[111,222,333,"alex"]
s1={"username":"alex","age":18}
s2=datetime.datetime.now() class person():
def __init__(self,a,b):
self.name=a
self.age=b
s3=person("yuan",18) return render(request,"index.html",{"name":s3}) -------------------------index.html
{#{{ name }}#}
{#{{ name.username }}#}
{{ name.name }}
{{ name.age }}

2、{% if %}的使用

{% if True %}   //if后面接的是表示True或False的对象,可以是Ture或False,也可以是字符串、数字,但字符串必须要加引号,如果不加引号解释器会认为是变量。
<p>hello world</p>
{% elif obj %} //这个obj在这里是变量,对应视图函数中render返回中的第三个参数
<p>hello 2</p>
{% endif %}

3、{% for %}的使用

----------------------views

def index(request):
s=[111,222,333,"alex"] return render(request,"index.html",{"obj":s}) ----------------------index.html {% for i in obj %}
<p>{{ forloop.counter }}:{{ i }}</p> //结果:1:111 2:222 3:333 4:alex
<p>{{ forloop.counter0 }}:{{ i }}</p> //结果:0:111 1:222 2:333 3:alex
<p>{{ forloop.revcounter }}:{{ i }}</p> //结果:4:111 3:222 2:333 1:alex
<p>{{ forloop.revcounter0 }}:{{ i }}</p> //结果:3:111 2:222 1:333 0:alex
{% endfor %}

4、filter的使用

语法格式:      {{obj|filter:param}}

filter其实是上模板语言提供的方法,它是将前面的一个对象传到后面的方法中,有参数的在过滤器后面加冒号,然后加参数,处理过后再返回值,虽然有很多方法和python很像,但是不是python的,不要搞混。

---------------------views

def index(request):
ret="alex" return render(request,"index.html",{"obj":ret}) ---------------------index.html {{ obj|upper }} //ALEX
{{ obj|lower }} //alex
{{ obj|first }} //a
{{ obj|first|upper }} //A
{{ obj|capfirst }} //Alex

add过滤器

---------------------------views

def index(request):
s4=6
return render(request,"index.html",{"obj":s4}) ---------------------------index.html {{ obj|add:5 }} //结果:11

cut过滤器

--------------------------views

def index(request):
s5="hello world"
return render(request,"index.html",{"obj":s5}) --------------------------index.html {{ obj|cut:"or" }} //结果:hello wld,如果cut的是字符串,要记得加上引号

date过滤器

--------------------------views

def index(request):
s2=datetime.datetime.now()
return render(request,"index.html",{"obj":s2}) --------------------------index.html {{ obj|date:"y-m-d" }} //18-05-08,后面的格式要用引号引起来
{{ obj|date:"Y-m-d" }} //2018-05-08

default过滤器:如果值是False就替换成设置的默认值,否则就是用本来的值

-----------------------------------views

def index(request):
s6=[]
return render(request,"index.html",{"obj":s6}) -----------------------------------index.html {{ obj|default:"空的" }}

{% autoescape off%}:注意这里是加在{% %}中的

#没加之前的效果
--------------------------------views def index(request):
s7="<a href='#'></a>"
return render(request,"index.html",{"obj":s6}) --------------------------------index.html {{ obj }} //<a href='#'>跳转</a> #加过之后的效果
--------------------------------views def index(request):
s7="<a href='#'></a>"
return render(request,"index.html",{"obj":s6}) --------------------------------index.html {% autoescape off %}
{{ obj }} //跳转
{% endautoescape %}

safe过滤器:和上面起到的效果一样,都是让浏览器去渲染这个标签

--------------------------------views

def index(request):
s7="<a href='#'></a>"
return render(request,"index.html",{"obj":s6}) --------------------------------index.html {{ obj|safe }} //跳转

其它过滤器:

-----------------------views

def index(request):
s5="hello world"
return render(request,"index.html",{"obj":s5}) -----------------------index.html {{ obj|filesizeformat }} //0 bytes,为什么是0?
{{ obj|length }} //11
{{ obj|slice:":-1" }} //hello worl

{% csrf_token %}:csrf_token标签

用于生成csrf_token的标签(其实就是一个input标签),用于防治跨站攻击验证。这个Input标签是隐藏的,名字为:csrfmiddlewaretoken,value是一堆字符串。

-------------------------------------views

def login(request):
if request.method=="POST":
return HttpResponse("登陆成功")
return render(request,"login.html") -------------------------------------index.html <form action="/login" method="post">
<p>姓名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<input type="submit">
{% csrf_token %}
</form>

这里有一点需要注意的,这个方法只适用于render,对于render_to_response不适用,如果想使用需要额外加命令。

{% url %}

--------------------------------urls

urlpatterns = [
path('admin/', admin.site.urls),
path('login', views.login,name="abc"),
] --------------------------------views def login(request):
if request.method=="POST":
return HttpResponse("登陆成功")
return render(request,"login.html") --------------------------------login.html <form action="{% url "abc" %}" method="post">
<p>姓名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<input type="submit">
{% csrf_token %}
</form>

{% verbatim %}:不进行render渲染

{% verbatim %}
{{ obj }}
{% endverbatim %}

{% load %}:在HTML文件中加载自定义的simple_tag和filter时用的。

自定义simple_tag和filter

1、在app中创建templatetags文件夹或包

2、在templatetags中创建.py文件

from django import template
from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.simple_tag
def myadd(v1):
return v1+1001 @register.filter
def myplus(v1,v2):
return v1+v2

3、在HTML文件中引入py文件,然后进行调用

{% load my_tags %}    可以在HTML最上面,可以不在

{% myadd 1 %}    #simple_tag用{% %}包着

{{ num|myplus:12 }}    #filter和其它自带filter一样都是用{{ }}包着

4、一定要在settings中的INSTALL_APPS配置当前app,不然Django无法找到文件

注意:filter中最多只能有两个参数,而simple_tag中可以多个,但是simple_tag不能用在for或if后面,而filter可以

{% if num|myplus:20 > 100 %}
<h1>大于100 </h1>
{% endif %}

Python:Day53 Template基础的更多相关文章

  1. Template 基础篇-函数模板(待看

    Template 基础篇-函数模板 Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第一部分. Template ...

  2. 深度学习入门者的Python快速教程 - 基础篇

      5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...

  3. [资料分享]Python视频教程(基础篇、进阶篇、项目篇)

    Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度.它可以用来开发各种程序,从简单的脚本任务到复杂的.面向对象的应用程序都有大显身手的地方.Python还被当作一 ...

  4. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  5. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  6. Python 3 集合基础和概念!

    Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...

  7. [Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念

    上一篇:[Python] 文科生零基础学编程系列--对象.集合.属性.方法的基本定义 下一篇: (仍先以最简单的Excel的VBA为例,语法与Python不同,但概念和逻辑需要理解透彻) p.p1 { ...

  8. [Python] 文科生零基础学编程系列三——数据运算符的基本类别

    上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...

  9. Python中Template使用的一个小技巧

    Python中Template是string中的一个类,可以将字符串的格式固定下来,重复利用. from string import Template s = Template("there ...

随机推荐

  1. Async/Await是这样简化JavaScript代码的

    译者按: 在Async/Await替代Promise的6个理由中,我们比较了两种不同的异步编程方法:Async/Await和Promise,这篇博客将通过示例代码介绍Async/Await是如何简化J ...

  2. 协程与Epoll的配合

    想快速了解协程与网络调用的原来么,那么请赶紧关闭本页,因为下面都是在扯淡. 这几天是端午假期,第一天大算照着网上一大堆基于ucontext来写协程的文章自己也写一个简单的协程实现.于是第一天我就开始动 ...

  3. angular select2 下拉单选和多选的取值赋值

    官网:http://select2.github.io/examples.html 兼容性: 引入文件 /select2.min.js /select2.min.css html <select ...

  4. POJ 2478Farey Sequence

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17744   Accepted: 7109 D ...

  5. loj#6436. 「PKUSC2018」神仙的游戏(生成函数)

    题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存 ...

  6. 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)

    题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...

  7. 开源项目商业模式分析(2) - 持续维护的重要性 - Selenium和WatiN

    该系列第一篇发布后收到不少反馈,包括: 第一篇里说的MonicaHQ不一定盈利 没错,但是问题在于绝大多数开源项目商业数据并没有公开,从而无法判断其具体是否盈利.难得MonicaHQ是公开的,所以才用 ...

  8. RabbitMQ 生产消息并放入队列

    前提已有 Exchange, Queue, Routing Key, 可以在 web 页面点击鼠标创建, 也可在消费端通过代码自动创建 web 页面配置步骤: https://www.cnblogs. ...

  9. error 2593 operator << 不明确的可能的解决方法

    编译Martinez算法时遇到该问题,提示重载的<<操作符调用不明确. 解决方法为:在cpp文件中将重载的该操作符的实现前添加完整的命名空间路径.

  10. Android为TV端助力 浅谈Aidl 通讯机制

    服务端: 首先是编写一个aidl文件,注意AIDL只支持方法,不能定义静态成员,并且方法也不能有类似public等的修饰符:AIDL运行方法有任何类型的参数和返回值,在java的类型中,以下的类型使用 ...