Python:Day53 Template基础

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

二、逻辑控制代码的组成

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

  语法格式:{{ var_name }}

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

(venv) C:UsersLowryPycharmProjectsdjango_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 %}
原文地址:https://www.cnblogs.com/sq5288/p/9000921.html