Django模板层

Posted majingjie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板层相关的知识,希望对你有一定的参考价值。

模板层

后端向前端页面传递数据方式

第一种

def index(request):
    n = 1
    return render(request,'index.html', 'n':n)

第二种

def index(request):
    n = 1
    return render(request,'index.html', locals())
    # 将当前所在的名称空间中的名字全部传递给前端页面

后端向前端页面传递不同类型数据

n = 6>>> 6 # 数字

s = 'hello'>>>hello # 字符串

l = ['a','b','c']>>>['a','b','c'] # 列表

d = 'name':'jason','password':'222'>>>'name':'jason','password':'222' # 字典

t = ('1','2','3','4')>>>('1','2','3','4') # 元组

st = 'python','java','php','go'>>>'python','java','php','go' # 集合

# 后端传函数名到前端,会自动加括号调用,显示return的值,但是不支持传参

# 后端传对象到前端,就相当于打印了这个对象

前端操作后端数据

前端获取后端传过来的容器类型的内部元素,统一采用句点符(.)

('关某某','谢某某','陈某某','容嬷嬷')>>>: t , t.1   # 数字对应的就是数据的索引

前端能够调用python后端数据类型的一些不需要传参的内置方法

'name':'jason','password':'222'
>>> d.keys 
>>> d.values 
>>> d.items 

模板语法的注释(不会展示到前端页面)
#调用python自带的内置方法,可以调用不传参数的一些内置方法 #
原生html注释(会展示到前端)
<!--我是原生的html注释-->

过滤器

<p>前端统计字符串的长度: s|length </p>

<p>前端获取数据如果是空就返回default后面默认的参数值: flag|default:'你这个东西是个空' </p>

<p>将数字格式化成表示文件大小的单位: file_size|filesizeformat </p>

<p> ctime </p>

<p>格式化时间(不要加百万分号): ctime|date:'Y-m-d' </p>

<p>字符串的切片操作: res|slice:'0:8' </p>
<p> res|slice:'0:8:2' </p>

<p>截取固定的长度的字符串 三个点也算: s|truncatechars:10 </p>

<p>按照空格截取文本内容: res|truncatewords:4 </p>

<p> 'hahah'|add:'heheheh' </p>

<p> ht </p> <!-- ht = '<h1>我是h1标签</h1>'-->

<p> sr </p> <!--'<script>alert(123)</script>'-->

<p> ht|safe </p>

<p> sr|safe </p>

前后端取消转义

前端

<p> ht </p> <!-- ht = '<h1>我是h1标签</h1>'-->

<p> sr </p> <!--'<script>alert(123)</script>'-->

<p> ht|safe </p>

<p> sr|safe </p>

后端

from django.utils.safestring import mark_safe

xxx = mark_safe('<h1>我是h1标签</h1>')

标签

for循环

% for foo in l %
    <p> foo </p>
    <p> forloop </p>
% endfor %

for循环可用的一些参数:

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

if判断

% if flag %
    <p>flag不为空</p>
% else %
    <p>flag是空</p>
% endif %

嵌套使用

% for foo in l %
    % if forloop.first %
        <p>第一次</p>
    % elif forloop.last %
        <p>最后一次</p>
    % else %
        <p>1</p>
    % endif %
% endfor %

empty

当for循环对象为空的时候会自动走empty代码块的内容

% for user in user_list %
    <li> user.name </li>
% empty %
    <li>空空如也</li>
% endfor %

自定义过滤器

必须做的三件事

  1. 在应用名下新建一个名为templatetags的文件夹(必须叫这个名字)

  2. 在该新建的文件夹内新建一个任意名称的py文件

  3. 在该py文件中需要固定写下面两句代码

    from django import template
    
    register = template.Library()

自定义过滤器

@register.filter(name='过滤器名')
def index(a,b):
    return a+b

自定义标签

# 自定义标签
@register.simple_tag
def plus(a,b,c):
    return a+b+cc

自定义inclusion_tag

# 自定义inclusion_tag
@register.inclusion_tag('html文件名',name='自定义名字')
def login(n):
    l = [ '第%s项'%i for i in range(n)]
    return 'l':l

html文件

<ul>
    % for foo in l %
        <li> foo </li>
    % endfor %
</ul>

调用

% 标签名 5 %

注意 :要想使用自定义的过滤器 标签 inclusion_tag 必须先在需要使用的html页面加载你的py文件

% load 'py文件名' %

模板的继承和导入

首先需要在被继承到的模板中划分多个区域

% block 给区域起的名字 %
    html代码。。。
% endblock %

通常情况下一个模板中应该至少有三块

% block css %
    页面css代码块
% endblock %

% block js %
    页面js代码块
% endblock %

% block content %
    页面主体内容
% endblock %

子模板的继承

先继承模板所有的内容

% extends 'home.html' %

然后根据block块的名字修改指定区域的内容

% block content %
<h1>登录页面</h1>
<form action="">
    <p>username:<input type="text" class="form-control"></p>
    <p>password:<input type="text" class="form-control"></p>
    <input type="submit" class="btn btn-success">
% endblock %

模板的导入

将一段HTML当做模块的方式导入到另一个html展示

% include '导入的html文件名' %

静态文件配置

% load static %


<!--第一种方式-->
<link rel='stylesheet' href="% static 'css/mycss.css'%">


<!--第二种方式-->
<link rel='stylesheet' href="% get_static_prefix %css/mycss.css"> 

以上是关于Django模板层的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中显式重置模板片段缓存?

使用 Django 模板作为片段

Django之模板层

微信小程序视图层WXML_模板

Django之模板层

Django----模板层