首页 > 其他 > 详细

模板层(模板语法)

时间:2019-06-11 22:12:35      阅读:120      评论:0      收藏:0      [点我收藏+]

模板层

  标签

  过滤器

  自定义标签 过滤器 inclusion_tag

  模板的继承

  模板的导入

#后期向前端页面传递数据的方式
#第一种
return render(request,index.html,{n:n})
#第二种
return render(request,index.html,locals())
#将当前所在的名称空间中的名字全部传递给前端页面

 

后端

from django.shortcuts import render

# Create your views here.

def index(request):
    n=6969
    s=你好  技术类的 束带结发了 jsddsfjl sdjfl1
    # l = [‘a‘, ‘b‘, ‘c‘,‘d‘,‘e‘,‘f‘,‘g‘]
    l = []
    d = {name:jason,password:22,hobby:[看书,学习,琴棋书画]}
    t = (观摩,邪魔,容嬷嬷)
    st ={python,java,php,golang}
    # flag = 123
    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 大帅比

    obj = Demo(jason)
    print(obj)   #<app01.views.index.<locals>.Demo object at 0x00000000042F7908>

    file_size = 231334
    from  datetime import datetime
    ctime = datetime.now()
    res = hello big ba by baj na jam lj

    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())  #将当前所在的名称空间中的名字全部传递给前端页面

 

前端

<p>{{ n }}</p>
<p>{{ s }}</p>

<p>{{ d }}</p>
<p>{{ d.hobby.2 }}</p>
<p>{{ t }}</p>
<p>{{ t.2 }}</p>
<p>{{ st }}</p> <!--集合无序-->
<p>{{  flag }}</p>
<p>{{ func }}</p> <!--无参函数 会自动加括号调用 -->

<p>{{ obj }}</p>  <!--<app01.views.index.<locals>.Demo object at 0x0000000004309E10>-->
<p>{{ obj.name }}</p>
<p>{{ obj.func }}</p>
<p>{{ obj.bar }}</p>   <!--不支持传参-->
<p>{{ obj.index }}</p>  <!--类方法绑定给类 不需要手动传入参数-->

{#过滤器#}
{#调用python自带的内置方法,可以调用不需要传参的一些内置方法#}
<!--我是原生的html注释-->  #这里的注释可以在前端页面检查看到
<p>前端统计字符串长度{{ s|length }}</p>
{#前端统计字符串长度30#}

<p>前端获取数据如果是空就返回default后面默认的数值》》》》{{ flag|default:‘flag没有值‘ }}</p>
{#前端获取数据如果是空就返回default后面默认的数值》》》》flag没有值#}


<p>把数字按照数据转换进制进行转换表示文件大小的单位:{{ file_size|filesizeformat }}</p>
{#把数字按照 数据转换进制 进行转换表示文件大小的单位:225.9 KB#}
<p>{{ ctime }}</p>
{#June 11, 2019, 3:15 p.m.#}

<p>格式化时间(不要加百分号){{ ctime|date:‘Y-m-d‘ }}</p>
{#格式化时间(不要加百分号)2019-06-11#}
<p>字符串的切片操作:{{ res|slice:‘0:8‘ }}</p>
{#hello bi#}

<p>{{ res|slice:‘0:8:2‘ }}</p>
{#hlob#}
<p>截取固定的长度的字符串 四个点也算:{{ s|truncatechars:10 }}</p>
{#截取固定的长度的字符串 三个点也算:你好 技术类...#}

<p>按照空格截取文本内容:{{ res|truncatewords:4 }}</p>
{#按照空格截取文本内容:hello big ba by ...#}

<p>{{ s|truncatewords:4 }}</p>
{#你好 技术类的 束带结发了 jsddsfjl ...#}

<p>{{ ‘hhha‘|add:‘hehheheh‘ }}</p>
{#hhhahehheheh#}


{#重点#}
<p>{{ ht }}</p>
{#<h1>我是h1标签</h1>#}
<p>{{ sr }}</p>
{#<script>alert(123)</script>#}
<p>{{ ht|safe }}</p>
{#前端可以识别#}
<p>{{ sr|safe }}</p>
{#告诉前端是安全的前端可以识别脚本语法#}
<p>{{ xxx }}</p>
{#后端处理好已经是安全的再去发给前端#}



{#标签#}
{% for foo in l %}
{# <p>{{ foo }}</p>#}
{# <p>{{ forloop.counter }}</p>#}
{# <p>{{ forloop.counter0 }}</p>#}
{% if forloop.first %}
  <p>这是第一次</p>
{% elif forloop.last %}
  <p>这是最后一次</p>
{% else %}
  <p>{{ foo }}</p>
{% endif %}
{% empty %}
  <p>你给我的容器是个空的啊!这怎么玩?</p>
{% endfor %}

{% if flag %}
<p>flag不为空</p>
{% else %}
<p>flag竟然是空的 卧槽</p>
{% endif %}



{% for foo in d.keys %}
<p>{{ foo }}</p>
{% endfor %}

{% for foo in d.values %}
<p>{{ foo }}</p>
{% endfor %}

{% for foo in d.items %}
<p>{{ foo }}</p>
{% endfor %}

{{ d.keys }}
{{ d.values }}
{{ d.items }}
{{ d.hobby.2 }}

{% with d.hobby.2 as h %} #这个是当你这个值用到的很多次的时候可以起别名 但是这个别名只能在with里面使用 原来的方式点语法依然可以使用
{{ h }}
{{ d.hobby.2 }}
{% endwith %}
 总结: 后端传函数名到前端,会自动加括号调用,但是不支持传参
    后端传对象到前端,就相当于打印了这个对象
    前端获取后端传过来的容器类型的内部元素,统一采用句点符号(.)
      <p>{{ d.hobby.2 }}</p> 数字对应的就是数据的索引
    前端能够调用python后端数据类型的一些不需要传参的内置方法
  模板语法的注意:
    不会展示到前端的页面:{#调用python自带的内置方法,可以调用不需要传参的一些内置方法#}
  原生html的注释
    会展示到前端:<!--我是原生的html注释-->

 

 前后端取消转义(*****) 脚本语法 js语法 都能识别

#前端
     |safe

#后端
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 %}
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>嗨起来!!!</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 在应用名下新建一个名为tmplatetags文件夹(必须叫这个名字)
#2 在该新建的文件夹内新建一个任意名称的py文件
#3 在该py文件中需要固定写下面两句代码

from django import template
register = template.Library()


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

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

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

#login.html
<ul>
    {% for foo in l %}
    <li>{{ foo}} </li>
    {% endfor %}
</ul>
#调用
#是将自定义的inclusion_tag 返回给它的括号内指定的小页面 在页面渲染好之后 是把这个渲染好的页面返回给调用页面的地方
{% login 5 %}

#注意:要想使用自定义的过滤器 标签 inclusion_tag 必须现在需要使用的html页面加载你的py文件
{% load my_tag%} #这个my_tag就是你tmplatetags文件夹下的py文件
{{ 666|XBB:8}} #过滤器
{% plus 1 2 3 %} #标签
{% login 5 %}  #inclusion_tag

 

 

模板的继承与导入

#首先需要再被继承的模块中划分多个区域
{% block 给区域起的名字 %}

{% endblock %}

#通常情况下一个模板中应该至少有三块
{% block css %}
页面css代码块
{% endblock %}

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

{% block contet %}  #注意起的名字不加引号
    页面主题内容
{% endblock %}

 

子板继承模板

#先继承模板所有的内容
{% extends ‘home.html‘ %}

#然后根据block块的名字修改指定区域的内容
{% block content %}
    <form action="">
    <p>username:<input type="text" class="form-control"></p>
    <p>password:<input type="text" class="form-control"></p>
    </form>
{% 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">  # 第二种方式

 

模板层(模板语法)

原文:https://www.cnblogs.com/lakei/p/11006285.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!