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. python实现高效率的排列组合算法-乾颐堂

    组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标 代表的数被选中,为0则没选中. 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数. 然后从左到右扫描数组 ...

  2. Python 与 Javascript 比较

    最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里.我觉得对于从Javascript转 ...

  3. [原创]Linux下使用Daemon实现服务器永久存活

    很多服务器端设计者,很少会考虑到服务器永久存活或热替换的问题,貌似真的很少 其中永久存活最大的理论支持就是,我们如何真正的保证一组服务器持续的存在,即便宕机? 其实没有人能保证自己写的代码那么完美无瑕 ...

  4. python 中面向对象编程简单总结2

    1.python中继承的特点: (1)总是从一个类继承,默认为object类 (2)不要忘记调用super.__init__方法来初始化父类的方法 def __init__(self,args): s ...

  5. [GO]简单的并发服务器

    package main import ( "net" "fmt" "strings" ) func HandleConn(conn net ...

  6. [operator]ELK6的安装

    找了很久才找到一个博客写得比较全面的,FrankDeng 系统环境:CentOS7 相关软件:node-v10.9.0.tar.gz.kibana-6.4.0-linux-x86_64.tar.gz. ...

  7. CodeForces 289A Polo the Penguin and Segments (水题)

    题意:给你 n 段区间,而且还是不相交的,然后你只能向左扩展左端点,或者向右扩展右端点,然后扩展最少的步数让整数总数能够整除 k. 析:很简单么,只要在记录算一下数量,然后再算出 k 的倍数差多少就行 ...

  8. 编写高质量代码改善C#程序的157个建议——建议79:使用ThreadPool或BackgroundWorker代替Thread

    建议79:使用ThreadPool或BackgroundWorker代替Thread 使用线程能极大地提升用户体验度,但是作为开发者应该注意到,线程的开销是很大的. 线程的空间开销来自: 1)线程内核 ...

  9. Statement 接口的应用(存在sql语句的注入风险)

    实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...

  10. Python 抓取html所有特定元素的方法

    直接上代码哦,够直接了吧~ from lxml import etree #import mechanize import lxml.html #import cookielib #br = mech ...