Django模板层(tetmplates.py)

结构:
​ 模板层(模板语法)
标签
​ 过滤器
​ 自定义标签,过滤器,inclusion_tag(可以传参)
​ 模板的继承
​ 模板的导入

传参

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

​第一种:

return render(request,"xx.html",{"num":num  }})

第二种:

return render(request,"yy.html",locals())

后端传函数到前端,会自动加括号调用,但是不支持传参

​后端传对象到前端,就相当于打印对象

​前端获取后端传来的容器类型的内部元素 统一用点(.)取值

示例代码

# 传给后端的不支持传参	
from django.views import View
class Mycls(View):
    def __init__(self,name):
        self.name=name
    def get(self):
        return self.name
    def __str__(self):
        return self.name
my = Mycls("wy")
l1 = [2,1,3,4]
dic = {"name":'wy',"password":"123"}
def publishadd(request):
    # pub = reverse("publish")
    x=100
    return render(request, "index.html",{"x":x,"func":func,"my":my,"l1":l1,"dic":dic})

index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<a href="{% url "publish" %}">点我</a>
<h1>{{ func }}</h1>
<h1>x的值为 {{ x }}</h1>
<h1>函数的值为{{ func }}</h1>
<h3>类的名字 {{my}}</h3>
<h4>列表为:{{ l1 }}</h4>
<h5>l1的第二个元素为{{ l1.2 }}</h5>
<h6>字典为{{ dic }}</h6>
<h6>字典为{{ dic.keys }}</h6>
<h6>字典为{{ dic.values }}</h6>
<h6>字典为{{ dic.items }}</h6>

</body>
</html>

​ 打印如下:

''' 

# 123

# x的值为 100

# 函数的值为123

### 类的名字 wy

#### 列表为:[2, 1, 3, 4]

##### l1的第二个元素为3

###### 字典为{'name': 'wy', 'password': '123'}

###### 字典为dict_keys(['name', 'password'])

###### 字典为dict_values(['wy', '123'])

###### 字典为dict_items([('name', 'wy'), ('password', '123')])

''''

过滤器

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

default 前端获取数据如果是空就返回default后面默认的参数值:{{ flag|default :"你这个东东为空"}}

将数字格式化成表示文件大小的单位:{{ file_size|filesizeformat }}

{{ ctime }}

格式化时间(不要加百分号){{ ctime|date:'Y-m-d' }}

字符串的切片操作:{{ res|slice:'0:8' }}

{{ res|slice:'0:8:2' }}

截取固定的长度的字符串 三个点也算:{{ s|truncatechars:10 }}

按照空格截取文本内容:{{ res|truncatewords:4 }}

{{ s|truncatewords:4 }}

{{ 'hahah'|add:'heheheh' }}

前端取消转义:

前端:
h | safe h为后端传入的数据,给浏览器前端渲染说是安全的,就能按照原内容显示
后端:

from django.utils.safestring import mark_safe
mark_safe('<h1>我是h1标签</h1>')

标签逻辑判断与循环:

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

for循环
{% for foo in s %}
{% if forloop.first %}
    <p>这是第一个{{ foo }}</p>
    {% elif forloop.last %}
    <p>这是最后一个{{foo}}</p>
    {% else %}
    <p>{{ forloop.counter0 }}***{{ foo }}</p>
{% endif %}
{% endfor %}

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 %}


自定义过滤器:

必须做的三件事:

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

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

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

from django import template

register = template.Library()

#自定义过滤器:

@register.filter(name="filt")

def index(a,b):

​	return a+b
from django.utils.safestring import mark_safe
from django import template
register = template.Library()
# 自定义标签{% plus %}
@register.simple_tag
def plus(a,b,c):
    return a*b*c
#自定义过滤器{{ | }}
@register.filter(name="XXX")
def index(x ,y):
    return x+y
#inclusion_tag
@register.inclusion_tag("login.html")
def login(n):
    l = ["第%s项"%i for i in range(n)]
    return {"l":l}
#将数据传到login.html页面,将渲染好的login.html给另一个页面使用


login.html

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
{% login 5 %}
<!--将数据传到login.html页面,将渲染好的login.html给另一个页面使用-->
</body>
</html>

调用方式

{% load filtertest %}
<h1> {{ 2000|XXX:200 }}
过滤器是{{ 666|XXX 777}}调用
    
标签
    
{% plus 1 2 3%}
    
inclusion_tag
    
{% login 5 %}

## 模板的继承与导入

模板的继承:

就是一个新的html文件继承一个以有的html文件:

继承操作:{% extends "home.html"% }

在继承的基础上重写原来区域:{ % block  content %}{% endblock %}框住的区域,要想还继承父类的所有东西用 {{ block.super }}继承的是原来区域的。


导入操作:
{% include ‘upload_file.html’ %}
login1.html

{% extends "home.html" %}
{% block content %}
<h1>登录</h1>
{# block.super 继承父类的东西被划分的区域   #}
{#    {% block content %} 是将父html的划分的区域重写#}
    {{ block.super }}
    <form action="">
    <p>username <input type="text" class="form-control"> </p>
    <p>password <input type="text" class="form-control"> </p>
    <p><input type="submit" class="btn btn-success"></p>
    </form>

{% endblock %}

home.html 被那个login1.html使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
{#    <script src="/static/jquery-3.4.1.min.js"></script>#}
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    {% block css %}
    {% endblock %}
</head>
<body>

<nav class="navbar navbar-default">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Brand</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
        <li><a href="#">Link</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
      </ul>
      <form class="navbar-form navbar-left">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search">
        </div>
        <button type="submit" class="btn btn-default">Submit</button>
      </form>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#">Link</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
<div class="container">
    <div class="row">
        <div class="col-md-3">
<ul class="list-group ">
    <a href="/login1/" class="list-group-item">login</a>
    <a href="/reg/" class="list-group-item">reg</a>

  <li class="list-group-item">Dapibus ac facilisis in</li>
  <li class="list-group-item">Morbi leo risus</li>
  <li class="list-group-item">Porta ac consectetur ac</li>
  <li class="list-group-item">Vestibulum at eros</li>
</ul>
</div>
 <div class="col-md-9">
    {% block content %}
            <div class="jumbotron">
          <h1>Hello, world!</h1>
          <p>...</p>
          <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
        </div>
     {% endblock %}
 </div>
    </div>

</div>
{% include 'upload_file.html' %}
{% block js %}

{% endblock %}



</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值