Django的模板与母版

Python Django 模板 母版 

Django模板系统

与Django模板有关的官方文档

语法相关

变量相关

  1. {{ 变量名 }} 

  2. {{ name }},{{name|length}},{{name|default:"默认值"}} 

变量名由字母数字和下划线组成。

点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
view中的代码:

def template_test(request):

l = [11, 22, 33]

d = {"name": "alex"}

class Person(object):

def __init__(self, name, age):

self.name = name

self.age = age

def dream(self):

return "{} is dream...".format(self.name)

Alex = Person(name="Alex", age=34)

Egon = Person(name="Egon", age=9000)

Eva_J = Person(name="Eva_J", age=18)

person_list = [Alex, Egon, Eva_J]

return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})

模板中支持的写法:

{# 取l中的第一个参数 #}

{{ l.0 }}

{# 取字典中key的值 #}

{{ d.name }}

{# 取对象的name属性 #}

{{ person_list.0.name }}

{# .操作只能调用不带参数的方法 #}

{{ person_list.0.dream }}

逻辑相关

if判断

{% if a > b %}

{% endif %}

{% if a > b %}

{% else %}

{% endif %}

{% if a > b %}

{% elif %}

{% else %}

{% endif %}


  1. for循环

for循环的基本用法:

{% for i in name_list %}


{{ i }}

{% endfor %}

{% for i in name_list %}

{{ i }}

{% empty %}

空空如也

{% endfor %}


for循环可用的属性:

forloop.counter


forloop.counter0

forloop.revcounter

forloop.revcounter0

forloop.first

forloop.last

forloop.parentloop -->两层for循环,内层循环引用外层循环


Filters-常用的内置filter

语法: {{ value|filter_name:参数 }}
'|'左右没有空格没有空格没有空格

  1. length

    {{ value|length }}
    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

  2. filesizeformat --> 格式化文件大小的

    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
    {{ value|filesizeformat }}
    如果 value 是 123456789,输出将会是 117.7 MB。

  3. date:'Y-m-d H:i:s' --> 格式化时间的
    {{ value|date:"Y-m-d H:i:s"}}

  4. slice 切片
    {{value|slice:"2:-1"}}

  5. safe

    XSS攻击(跨站脚本攻击)
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
    比如:
    value = "点我"
    {{ value|safe}}

  6. truncatechars:20

    截取字符,超过的用...表示
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
    参数:截断的字符数
    {{ value|truncatechars:9}}

  7. default

    如果没有传值,可显示的默认值
    {{ value|default: "nothing"}}
    如果value值没传的话就显示nothing

自定义的filter

  1. 定义阶段
    1. 在app下面新建一个python的包:templatetags
    2. 在上面的Python包中新建一个Python文件,名字随意

在上述python文件中:

from django import template


# 生成一个注册用的实例

register = template.Library()

# 定义并注册一个自定义的filter函数

@register.filter(name='addsb')

def add_sb(arg):

return "{} sb".format(arg)


  1. 调用阶段:
    1. 在Django的模板文件中,导入刚才新建的python文件
      {% load py文件名 %}
    2. 按照filter的语法调用
      {{ name|addsb }}

母版和继承

母版

  1. 为什么要有模板和继承:
    把多个页面公用的部分提取出来,放在一个 母版 里面。
    其他的页面只需要 继承 母版就可以了。
  2. 具体使用的步骤:
    1. 把公用的HTML部分提取出来,放到base.html文件中
    2. 在base.html中,通过定义block,把每个页面不同的部分区分出来
    3. 在具体的页面中,先继承母版
    4. 然后block名去指定替换母版中相应的位置

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="x-ua-compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title>Title</title>

{% block page-css %}

{% endblock %}

</head>

<body>

<h1>这是母板的标题</h1>

{% block page-main %}

{% endblock %}

<h1>母板底部内容</h1>

{% block page-js %}

{% endblock %}

</body>

</html>


注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

继承母版

  1. {% extends 'base.html' %} --> 母版文件:base.html要加引号
  2. {% extends 'base.html' %}必须放在子页面的第一行!!!
  3. 可以在base.html中定义很多block,通常我们会额外定义page-css和page-js两个块
  4. view.py相应的函数中返回的是对应的子页面文件 不是不是不是 base.html

组件

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

{% include 'navbar.html' %}

静态文件的灵活写法

{% load static %}

<img src="{% static "images/hi.jpg" %}" alt="Hi!" />


引用JS文件时使用:

{% load static %}

<script src="{% static "mytest.js" %}"></script>


某个文件多处被用到可以存为一个变量:

{% load static %}

{% static "images/hi.jpg" as myphoto %}

<img src="{{ myphoto }}"></img>


使用get_static_prefix

{% load static %}

<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />


或者

{% load static %}

{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />

<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />


自定义simpletag

和自定义filter类似,只不过接收更灵活的参数。

定义注册simple tag

@register.simple_tag(name="plus")

def plus(a, b, c):

return "{} + {} + {}".format(a, b, c)


使用自定义simple tag

{% load app01_demo %}

{# simple tag #}

{% plus "1" "2" "abc" %}


inclusion_tag

多用于返回html代码片段

示例:

templatetags/my_inclusion.py

from django import template

register = template.Library()

@register.inclusion_tag('result.html')

def show_results(n):

n = 1 if n < 1 else int(n)

data = ["第{}项".format(i) for i in range(1, n+1)]

return {"data": data}


templates/snippets/result.html

<ul>

{% for choice in data %}

<li>{{ choice }}</li>

{% endfor %}

</ul>


templates/index.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="x-ua-compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title>inclusion_tag test</title>

</head>

<body>

{% load inclusion_tag_test %}

{% show_results 10 %}

</body>

</html>



Django的模板与母版的更多相关文章

  1. Django之模板引擎(母版)

    Django之模板引擎(母版) 母版:存放所有页面的基本信息,基本样式 子班:继承母版 自定义当前页面私有的样式信息 母版的样式: {% block xxx(名称) %} xxxxxxx(数据) {% ...

  2. python 之 Django框架(模板系统、过滤器、simple_tag、inclusion_tag、Tags、母版、组件)

    12.35 Django模板系统 {{ }}和 {% %},变量相关的用{{}},逻辑相关的用{%%} app02/views: # 模板语言测试函数 def template_test(reques ...

  3. Django(五)母版继承、Cookie、视图装饰器等

    大纲 一.内容回顾 补充:默认值 补充:命名空间 二.模板语言 1.母版继承 2.include 3.自定义simple_tag 三.Cookie Cookie 使用总结 四.视图 1.获取用户请求相 ...

  4. Django的模板层

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  5. Django:模板系统

    一,常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二,常量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊 ...

  6. Django框架-模板层

    Django框架-模板层 一.模板语法传值 1.验证是否python所有的数据类型都可以传递到前端 locals()的妙用:该方法虽然好用,但是在某些情况下会造成资源的浪费 结论:整型.浮点型.字符串 ...

  7. 第四篇Django之模板语言

    Django之模板语言 一 模板的执行 模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户 def current_da ...

  8. python学习笔记--Django入门二 Django 的模板系统

    为了使网站更干净简洁更容易维护,页面的设计和Python的代码必须分离开.我们可以使用Django的 模板系统 (Template System)来实现这种模式. 几个简单的模板标签(tag):   ...

  9. 第四章:Django 的模板系统(转)

    在之前的章节中,你可能觉得例子中视图返回文本有点不妥.即是, HTML 是直接写在 Python 代码中的.     这种做法会导致这些问题:     要做任何设计上的更改就必须改写 Python 代 ...

随机推荐

  1. p2944 [USACO09MAR]地震损失2Earthquake Damage 2

    传送门 分析 我们让s到1,关键点到t分别连流量为inf的边 于是我们可以考虑跑s到t的最小割 于是我们将所有点拆为两个点,关键点和1的两个点之间连inf,其余点连1 将原图的边也连上,流量为inf ...

  2. [Training Video - 4] [Groovy] Initializing log inside class with constructor

    TestService s = new TestService(log,context,testRunner) s.xyz() class TestService{ def log def conte ...

  3. RAW编程接口

    LWIP移植好之后,就要使用它提供的API接口来编写程序.

  4. 实践作业4:Web测试实践(小组作业)每日任务记录5

    (一)今日任务更新 本次小组作业均已完成! 本组文件最终pdf文件(文件稍大,请耐心等待加载):https://files.cnblogs.com/files/ruanshuo170204/Web测试 ...

  5. javascript总结40:DOM中操作样式的两种方式

    1 DOM中操作样式的两种方式 1 通过元素的style属性 注意: 通过style属性设置样式时,css中要写单位的属性,在js代码中也要加单位 //html <div id="bo ...

  6. Demo—cookie电商购物车

    说明:cookie的操作须有域名,简单点说就是需要用发布的方式去访问,查看cookie信息请用开发者模式进入application栏 1.页面布局(结构)(根目录) 商品列表 <!doctype ...

  7. 大型Unity手游《英雄之刃-最后之战》源码分析

    英雄之刃之最后一战是国内首款原创精品MOBA手游,是一款由前暴雪文案亲自操刀世界观,日韩专业团队打造美术场景,新加坡团队精心制作战斗音乐的旷世之作! 超快速的匹配对战.默契的团队协作给你带来意犹未尽的 ...

  8. 编写高质量代码改善C#程序的157个建议——建议76: 警惕线程的优先级

    建议76: 警惕线程的优先级 线程在C#中有5个优先级:Highest.AboveNormal.Normal.BelowNormal和Lowest.讲到线程的优先级,就会涉及线程的调度.Windows ...

  9. Understanding sun.misc.Unsafe

    转自: https://dzone.com/articles/understanding-sunmiscunsafe The biggest competitor to the Java virtua ...

  10. 不用SQL给打印记录编号

    以QUICKREPORT为例 页面设置如下: 其中ID为编号. 设置为表的ID字段. QUICKREPORT所在的FORM添加一个变量: var FprnT6: TFprnT6; Vxh:intege ...