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. LinuxSystemProgramming-Syllabus

    Linux System Programming Syllabus

  2. Flip

    Flip是一个能够让任意HTML.文本或jQuery Element产生漂亮翻转效果的jQuery插件. 可以配置翻转方向:从右到左.上到下或从左到右.下到上.翻转的速度也可以配置. 效果如下图所示: ...

  3. RCC—使用 HSE/HIS 配置时钟

    RCC :reset clock control  复位和时钟控制器:特别是要着重理解时钟树,理解了时钟树,F429 的一切时钟的来龙去脉都会了如指掌. STM32F4系列有5个时钟源: LSIRC( ...

  4. JDBC 连接 MySQL 时碰到的小坑

    最近从MS SQL Server换到了MySQL,已经是8.11版本了,安装的时候似乎还用了新的身份认证方式之类的,连接过程中也是磕磕绊绊,碰到很多奇奇怪怪的问题,在此记录下来. 驱动加载: 以前使用 ...

  5. Spring框架总结(四)

    对象依赖关系 Spring中,如何给对象的属性赋值?  [DI, 依赖注入] 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4)自动装配(了解) 5) 注解 一.对象属性赋值 ...

  6. CodeForces 682C Alyona and the Tree (树上DFS)

    题意:给定一棵树,每个叶子有一个权值,每条边也有一个权值,现在让你删最少的结点,使得从任何结点出发到另一个结点的边上权值和都小于两个结点的权值. 析:很明显是DFS,不过要想找出最少的结点可能不太容易 ...

  7. after modifying system headers, please delete the module cache at

    5down votefavorite 2 I don't know how I modified a iOS SDK file, but Xcode say I did. Here is what t ...

  8. 看图说说JVM内存

  9. NIOS II SOPC系统自定义IP常见知识点总结

    封装IP1.将写好的Verilog代码添加在Quartus工程中,IP目录下,(如果没有,自己建一个)2.打开Qsys工具,选择New Component3.name和Display name输入合理 ...

  10. MFC 错误异常,用vs添加资源并为资源定义类后报错:error C2065 : 未声明的标识符

    添加了一个Dialog资源,修改了ID之后右击资源添加了一个类,在类里面有一个成员变量: // 对话框数据    enum { IDD = IDD_GETIN }; 而在编译过程中出现报错,错误代号是 ...