Django之模板层

一、后端朝前端发送数据的方式

第一种:

return render(request,'index.html',{'n':n})

第二种:

return render(request,'index.html',locals())

第二种方式会将当前名称空间的所有名字全部传递到前端,即模板层。

注:

 

  • 后端传函数名到前端,会自动加括号调用,但是不支持传参;
  • 后端传对象到前端,就相当于打印了这个对象;
  • 前端获取到后端传递过来的容器类型,统一采用句点符(.)取值,例如:{{ ls.1 }} ,这里数字指的是索引。{{ d.key }},针对字典取值
  • 前端能够调用python后端数据类型的一些不需要传参的内置方法

 二、注释

不会展示到前端页面(即在浏览器检查源码时这个注释是不显示的):

{# 这是模板语言的注释 #}

三、渲染变量

views.py的代码:

def index(request):
    n = 6969
    s = '桃李春风一杯酒,江湖夜雨十年灯'
    l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    d = {'name': '战狼', 'password': '123', 'hobby':['耍枪', '弄棒', '装逼']}
    t = ('赵铁锤', '王大炮', '李银弹', '刘志鹏')
    st = {'python', 'java', 'swift', 'golang'}
    flag = None
    def func():
        return '你偷偷摸摸叫我出来干嘛?'
    class Demo(object):
        def __init__(self, name):
            self.name = name

        def func(self):
            return self.name
        @classmethod
        def index(cls):
            return 'cls'
        @staticmethod
        def bar(name, age):
            return 'bar'
        def __str__(self):
            return 't[3]真是个大帅比'
    obj = Demo('sgt')
    return render(request, 'index.html', locals())

 

有些经常要用的变量,但是要拿到它写的代码过长,那么可以使用with起别名。

 

 四、过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器。

例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

注意事项:

  1. 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  2. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
  3. 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
  4. '|'左右没有空格没有空格没有空格

views.py的代码:

def index(request):
    s = '桃李春风一杯酒,江湖夜雨十年灯'
    flag = None
    file_size = 213213453
    from datetime import datetime
    ctime = datetime.now()
    res = 'hello big ba by ba by bab y baby b ab y'
    ht = '<h1>我是h1标签</h1>'
    sr = '<script>alert(123)</script>'
    from django.utils.safestring import mark_safe
    xxx = mark_safe('<h1>我是h1标签</h1>')
    return render(request, 'index.html', locals())

index.html----此处是一些过滤器的用法举例

<p>前端统计字符串的长度:{{ s|length }}</p>
<p>获取数据如果是空就返回default后的默认值:{{ flag|default:'为空啊' }}</p>
<p>将数字格式化成表示文件大小的单位:{{ file_size|filesizeformat }}</p>
<p>{{ ctime }}</p>
<p>格式化时间:{{ ctime|date:'Y-m-d H:i:s' }}</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>{{ 'haha'|add:'hehe' }}</p>
{#重点#}
<p>{{ ht }}</p>
<p>{{ sr }}</p>
{#通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。#}
<p>{{ ht|safe }}</p>
{#使其能够弹窗#}
<p>{{ sr|safe }}</p>
{#xxx在后端利用mark_safe模块进行了标记#}
<p>{{ xxx }}</p>

此处需要注意一个取消转义的标记:

前端取消转义:

        {{ h|safe }}

后端取消转义:

        from django.utils.safestring import mark_safe

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

 join拼接(此处以空格做拼接符)

 五、标签(tags)

5.1、普通for循环

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用的一些参数:

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

 

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

后端:
          l = None

前端:

{% for foo in l %}
	{% if forloop.first %}
		<p>这是我的第一次</p>
	{% elif forloop.last %}
		<p>这是最后一次了啊</p>
	{% else %}
		<p>嗨起来!!!</p>
	{% endif %}
	{% empty %}
		<p>你给我的容器类型是个空啊,没法for循环</p>
{% endfor %}

5.2、if判断

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

5.3、嵌套使用

{% for foo in l %}
	{% if forloop.first %}
		<p>这是我的第一次</p>
	{% elif forloop.last %}
		<p>这是最后一次了啊</p>
	{% else %}
		<p>嗨起来!!!</p>
	{% endif %}
{% endfor %}

 六、自定义过滤器、自定义标签、自定义inclusion_tag

在自定义这些之前需要做的三件事:

  • 在应用下新建一个templatetags文件夹,必须叫这个名字
  • 在新建的templatetags文件夹内新建一个任意名称的py文件(我的叫:my_tag.py)
  • 在该py文件中需要固定写下面两句代码
from django import template

register = template.Library()

 

6.1、自定义过滤器

自定义过滤器只能是带有一个或两个参数的Python函数。

from django import template

register = template.Library()

# 自定义过滤器
@register.filter(name='XBB')
def index(a, b):
    return a + b

 然后导入到模板层使用:

{% load my_tag %}
{{ 10|XBB:10 }}

 

6.2、自定义标签

@register.simple_tag
def plus(a, b, c):
    return a+b+c

 模板层使用:

{# 第一步一定要先注册(load) #}
{% load my_tag %}  
{% plus 1 2 3 %}

 6.3、自定义inclusion_tag

原型: django.template.Library.inclusion_tag()

主要作用:通过渲染一个模板来显示一些数据

例如,Django的Admin界面使用自定义模板标签显示"添加/更改"表单页面底部的按钮。这些按钮看起来总是相同,但链接的目标却是根据正在编辑的对象而变化的。

前端,把多余的都删掉,在login.html中写一段代码。

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

后端:

@register.inclusion_tag('login.html', name='login')
def login(n):
    l = ['第%s项'%i for i in range(n)]
    return {'l': l}

index.html中使用:前端调用login,走了login函数,然后把l交给了login.html渲染,最后返回到了index.html页面。

{% load my_tag %}
{% login 5 %}

最后注意:

如果想要使用自定义的过滤器,标签,inclusion_tag,必须先在需要使用的html页面加载templatetags下的py文件。 

即  {% load my_tag %}

七、模板的继承与导入

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

{% block 给区域起的名字 %}
继承的代码
{% endblock %}

通常情况下,一个模板中应该至少有3块划分的区域:

{% 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">
		</form>
{% endblock %}

模板的导入:

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

{% include '想导入的html文件名' %}

举例:

如上的页面,导航条和侧边栏要在其他页面重复使用,只需要修改绿色框圈出的巨幕区域。那么首先要给巨幕划分一个块,并给它取名为content。

 

 上面的home.html是主页。如果我的注册页面reg.html想用它,只对巨幕的那块做修改,可以如下操作:

访问它,发现其他都保留,只有巨幕换成了注册:

有了上面的经验,如果我们想写一个登录呢?然后我们还想给这个登录继承一些其他的东西:

 

hualihushao.html

 

八、静态文件配置

首先在settings.py配置文件中注册静态文件夹:

然后在文件中load并使用:

 

在最前面加这句:

{% load static %}   

然后用下面的导入方式导入:

<link rel='stylesheet' href="{% static 'css/mycss.css'%}">  # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">  # 第二种方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值