WebFramework-Basis-3rd

周一,晴,记录生活分享点滴

参考博客1:https://www.cnblogs.com/yuanchenqi/articles/6083427.html

参考博客2:https://www.cnblogs.com/5poi/p/6649101.html

 

Django 1.3

Template(模板)

模版的组成

HTML代码+逻辑控制代码

模版的渲染

>>> python manange.py shell  (进入该django项目的环境)
>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
'My name is Stephane.'

 

逻辑控制代码的组成

变量

语法格式:使用双大括号来引用变量

{{var_name}}

Template和Context对象

>>> python manange.py shell  (进入该django项目的环境)
>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
'My name is Stephane.'
​
​
# 同一模板,多个上下文,一旦有了模板对象,你就可以通过它渲染多个context,无论何时我们都可以
# 像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染会更为高效:
# Low
for name in ('John', 'Julie', 'Pat'):
    t = Template('Hello, {{ name }}')
    print t.render(Context({'name': name}))
​
# Good
t = Template('Hello, {{ name }}')
for name in ('John', 'Julie', 'Pat'):
    print t.render(Context({'name': name}))

推荐方式

from django.shortcuts import render,HttpResponse
from django.template.loader import get_template #记得导入
# Create your views here.
import datetime
from django.template import Template,Context
​
​
# 推荐写法 -------------------------------------------------------------------------------------------
def current_time(req):
    now=datetime.datetime.now()
    return render(req, 'current_datetime.html', {'current_date':now})
​
​
# 原始的视图函数(不推荐)------------------------------------------------------------------------------
def current_time(req):
    now=datetime.datetime.now()
    html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now
    return HttpResponse(html)
​
​
# django模板修改的视图函数(不推荐)---------------------------------------------------------------------
def current_time(req):
    now=datetime.datetime.now()
    t=Template('<html><body>现在时刻是:<h1 style="color:red">{{current_date}}</h1></body></html>')
    t=get_template('current_datetime.html')
    c=Context({'current_date':now})
    html=t.render(c)
    return HttpResponse(html)

句点号(深度变量的查找)

# 后端数据 :
s = 'hello'
s1 = [1,2]
s2 = { 'user':'eriic' }
s3 = time.localtime()
s4 = Foo( 'eroiic' , 20 )
 
# 页面取值 :
{{ obj.1 }}       # 索引取值
{{ obj.user }}    # 根据字段key取值
{{ obj.year }}    # 根据属性取值
{{ obj.name }}    # 取类中字段

Filter(过滤器)

语法格式

{{obj|filter:param}}

方法

add              # 给变量加上相应的值
addslashes       # 给变量中的引号前加上斜线
capfirst         # 首字母大写
cut              # 从字符串中移除指定的字符
date             # 格式化日期字符串
default          # 如果值是False,就替换成设置的默认值,否则就是用本来的值
default_if_none  # 如果值是None,就替换成设置的默认值,否则就使用本来的值

实例

# value1="aBcDe"  -----------------------------------------------------
{{ value1|upper }}
​
# value2=5  -----------------------------------------------------------
{{ value2|add:3 }}
​
# value3='he  llo wo r ld'  -------------------------------------------
{{ value3|cut:' ' }}
​
# import datetime  ----------------------------------------------------
# value4=datetime.datetime.now()
{{ value4|date:'Y-m-d' }}
​
# value5=[]  ----------------------------------------------------------
{{ value5|default:'空的' }}     # 设置默认值
# value6='<a href="#">跳转</a>'  -------------- 【有重点】 --------------
{{ value6 }}                    # 字符串形式在页面显示
​
{% autoescape off %}            # 渲染成浏览器能解析的标签
  {{ value6 }}
{% endautoescape %}
​
{{ value6|safe }}               # 效果同上(显示“跳转”链接)·【重点】
​
{{ value6|striptags }}
​
# value7='1234'  ------------------------------------------------------
{{ value7|filesizeformat }}     # obj 数据的大小 ~kb
{{ value7|first }}              # 取第一个值
{{ value7|length }}             # 得到长度
{{ value7|slice:":-1" }}        # 切片
# value8='http://www.baidu.com/?a=1&b=3'  -----------------------------
{{ value8|urlencode }}          # 进行url编码
# value9='hello I am eriic'  ------------------------------------------
{{ value9|truncatechars:'6' }}  # 按字符截断   总显示3个点, 占用3个位置!
{{ value9|truncatewords:'6' }}  # 按单词截断

标签(tag)的使用

使用大括号和百分比的组合来表示使用tag

{% tags %}

1、{% if %} 的使用

不允许同一标签里同时出现and和or,否则逻辑容易产生歧义

{% if num >= 100 and 8 %}
​
{% elif num < 100%}
    <p>num小于100</p>
​
{% else %}
    <p>num等于100</p>
​
{% endif %}

2、{% for %}的使用

{% for i in obj %}
​
# obj 为列表 , i 为值
    {{ forloop.counter }}    # 模拟索引 , 从1开始算
    {{ forloop.counter0 }}   # 模拟索引 , 从0开始算
    {{ forloop.revcounter }} # 反序索引 , 从最后开始算
# obj 为字典 , i 为key , 或者改为: obj.keys obj.values obj.items 进行循环
​
{% endfor %}

3、{%csrf_token%}

csrf_token标签,放到 form 表单里,生成一个input标签,和其他表单标签一起提交给后台,用于防治跨站攻击验证。

4、{% with %}

用更简单的变量名替代复杂的变量名

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} 
    {{ total }}
{% endwith %}

5、{% verbatim %}

禁止变量被渲染

{% verbatim %}
    {{ hello }}              # 页面直接显示 {{ hello }}
{% endverbatim %}

6、{% load %}

加载标签库

自定义filter和simple_tag·重点

  1. 首先在setting中installed_apps 添加当前的app项目

    # settings.py
    ​
    INSTALLED_APPS = [
        ...
        "app01"
    ]
  2. app项目下创建templatetags/tags(名字是固定的,不能变)

  3. 创建任意文件 如 my_tags.py

  4. 引入类,自定义函数

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()   # register的名字是固定的,不可改变
    
    # filter 
    @register.filter      
    def filter_multi(v1,v2):
        return  v1 * v2
    
    # simple_tag
    @register.simple_tag  
    def simple_tag_multi(v1,v2):
        return  v1 * v2
    
    @register.simple_tag
    def my_input(id,arg):
        result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
        return mark_safe(result)
  5. HTML中使用

    {% load my_tags %}       # 引入外部文件, 位置在最上面
    # 使用:
    {% my_add 100 101 %}     # simple_tag 可以传入多个参数, 不能用于if语句
    {{ obj | my_add:num2 }}  # filter 最多两个参数, if 语句可以跟filter

模版继承

include 模板标签 {% include %}

该标签允许在(模板中)包含其它的模板的内容。

标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。

每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。

extend(继承)模板标签

减少共用页面区域所引起的重复和冗余代码

  • 方法一:解决该问题的传统做法是使用服务器端的 includes ,在 HTML 页面中使用该指令将一个网页嵌入到另一个中。

  • 方法二:模板继承是先构造一个基础框架模板,然后在其子模板中对它所包含站点公用部分和定义块进行重载。

#1 -- base.html     存放的是页面共有的代码
....
{% block content %}      # 非共有部分用 block代替, block名字(content)自定义 
    ...
{% endblock %}
​
​
#2 -- order.html    只保留非公有部分的代码
{% extend 'base.html' %}   # 继承外部文件,引入模板,位置放在最上面
{% block cotent %}         # 非公有部分的代码, 会对base.html中的block进行替换
    .... 
{% endblock %}             # 没有对应上的 block 会在base中原样显示
# 如果需要同时显示父级的代码 和自己代码 可以嵌套使用
{{ block.super }}

day55 

 

posted @ 2020-07-13 17:17  ChungZhao  阅读(171)  评论(0编辑  收藏  举报