zoukankan      html  css  js  c++  java
  • Django的模板与母版

    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>

  • 相关阅读:
    JavaScript内存泄漏(转)
    深入理解JavaScript的变量作用域(转)
    Spring MVC 配置(备忘)
    French fashion in Paris
    Windows Server 2003、 WindowsXP, 中和 Windows 2000 中的缓存凭据安全
    doc.txt.exe病毒。
    Exchange server 增加RBL
    无以穷尽的工作。。。
    windows SBS Exchange 数据库恢复
    VLAN介绍
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/9368448.html
Copyright © 2011-2022 走看看