zoukankan      html  css  js  c++  java
  • Django Template模板

    作为一个网络框架,Django的需要一种动态生成HTML的便捷方法。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述动态内容将被插入的一些特殊语法

    模板语言Jinja2

    变量

    {{ foo }}
    {{ foo.bar }}

    使用点 .访问变量的属性。

    filter

    变量可以通过过滤器修改。语法{ { 变量|过滤器 }},并且也可以用冒号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入。

    {{ list|join:', ' }}
    {{ name|striptags|title }}

    内置过滤器清单

    abs(value):返回一个数值的绝对值。 default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。
    escape(value):转义字符,会将<>等符号转义成HTML中的符号。
    first(value):返回一个序列的第一个元素。
    format(value,*arags,**kwargs):格式化字符串。
    last(value):返回一个序列的最后一个元素。
    length(value):返回一个序列或者字典的长度。
    join(value,d=u''):将一个序列用d这个参数的值拼接成字符串。
    safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。
    int(value):将值转换为int类型。
    float(value):将值转换为float类型。
    lower(value):将字符串转换为小写。
    upper(value):将字符串转换为小写。
    replace(value,old,new): 替换将old替换为new的字符串。
    truncate(value,length=255,killwords=False):截取length长度的字符串。
    striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
    trim:截取字符串前面和后面的空白字符。
    string(value):将变量转换成字符串。
    wordcount(s):计算一个长字符串中单词的个数。
    内置过滤器

    if

    if标签也可以使用and, or, not, ==, !=, <, >,, <=, >=, in ,not in, is, is not。

    {% if athlete_list %}
        Number of athletes: {{ athlete_list|length }}
    {% elif athlete_in_locker_room_list %}
        Athletes should be out of the locker room soon!
    {% else %}
        No athletes.
    {% endif %}

    for

    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% endfor %}
    </ul>

    csrf_token

    用于CSRF保户,防止跨站点请求伪造。

    <form action="/app/login.html" method="POST">
    {% csrf_token %}
        <input id="username" type="text" name="username" placeholder="用户名">
        <input id="password" type="password" name="password" placeholder="密码">
        <input id="submit" type="submit" value="登陆">
    </form>

    with

    以更简单的名称缓存复杂变量。对一些复杂变量的设置别名,可以设置多个变量。

    {% with total=business.employees.count one=1 %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}

    url

    可以对URLconf中的规则设置别名,然后使用url标签访问。

    urls.py设置name属性为logout

    re_path(r'logout.html$', Logout.as_view(), name="logout")

    模板中

    <a href={% url "logout" %}>注销</a>
    <!-- 或者 -->
    {% url "logout" as the_url %}
    <a href={{ the_url  }}>注销</a>

    模板继承

    {% block %}:标签:在父模板中预留区域,在子模板中填充;

    {% extends %}:标签:写在子模板的第一行,标明继承对象;

    {{ block.super }}:从父模板获取块的内容,而不是直接覆盖。

    基本模板

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户管理</title>
        <style>
            body{
                margin: 0 auto;
                padding: 0;
                height: 100%;
                width: 100%;
            }
            // 定义一个css的继承块
            {% block style %}
            {% endblock %}
        </style>
    </head>
    <body>
        <div class="content">
            // 定义一个内容的继承块
            {% block content %}
            {% endblock %}
        </div>
        <script>
            // 定义一个JavaScript的继承块
            {% block script %}
            {% endblock %}
        </script>
    </body>
    </html>
    base.html

    子模版

    <!-- 指定继承的模板 -->
    {% extends "myapp/base.html" %}
    <!-- 在模板基础上添加css样式 -->
    {% block style %}
        .content .content-main{
            margin: 0 auto;
             80%;
        }
    {% endblock %}
    <!-- 在模板基础上添加内容 -->
    {% block content %}
        <!-- 继承父模板block中的代码 -->
        {{ block.super }}
        <div class="content-main">
            <h1>hello {{ user }}</h1>
            <a href="/logout.html">注销</a>
        </div>
    {% endblock %}
    <!-- 在模板基础上添加js代码 -->
    {% block script %}
        window.onload = function(){
            alert("hello")
        }
    {% endblock %}
    index.html

    自动HTML转义

    Django具有自动HTML转义功能,可以防止跨站点脚本(XSS)攻击;

    默认情况下,Django中的每个模板都会自动转义每个变量标记的输出

    • < 转换为 &lt;
    • > 转换为 &gt;
    • ' (单引号)转换为 &#39;
    • " (双引号)转换为 &quot;
    • & 转换为 &amp;

    使用safe过滤器,可以禁用单个变量的自动转义;

    {% autoescape %}可以对代码块进行转义控制;

    {{ data|safe }}
    
    # 禁用转义
    {% autoescape off %}
        This will not be auto-escaped: {{ data }}.
        Nor this: {{ other_data }}
    
        # 开启自动转义
        {% autoescape on %}
            Auto-escaping applies again: {{ name }}
        {% endautoescape %}
    {% endautoescape %}

    自定义过滤器

    过滤器只能传递一个参数。

    创建一个包,布局如下:

    myapp/
        __init__.py
        models.py
        templatetags/
            __init__.py
            myapp_extras.py
        views.py

    在myapp_extras.py中自定义过滤器

    from django import template
    
    register = template.Library()
    
    # 使用装饰器注册自定义过滤器
    @register.filter
    def my_cut(value, arg):
        return value.replace(arg, ', ')
    
    # 函数注册自定义过滤器
    # register.filter('my_cut', my_cut)

    在模板中引用

    # 首先要使用load标签加载自定义过滤器
    {% load my_tags %}
    # 使用自定义过滤器,并传入参数
    {{ user|my_cut:',' }}

    自定义标签

    标签可以接受多个参数。

    在myapp_extras.py中自定义标签

    from django import template
    
    register = template.Library()
    
    @register.simple_tag
    # 可以传入各种参数
    def my_tag(a, *args, **kwargs):
        b = kwargs['message']
        return str(a) + str(b)

    在模板中引用

    # 首先要使用load标签加载自定义过滤器
    {% load my_tags %}
    # 使用自定义标签,并传入参数
    {% my_tag 1 user.name message="it's ok"%}
  • 相关阅读:
    RQNOJ 34 紧急援救
    Codevs 2080 特殊的质数肋骨
    POJ2975 Nim
    Bzoj1016 最小生成树计数
    POJ3613 Cow Relays
    POJ1386 Play on Words
    [从hzwer神犇那翻到的模拟赛题] 合唱队形
    HDU2824 The Euler function
    HDU1576 A/B
    HDU2669 Romantic
  • 原文地址:https://www.cnblogs.com/houyongchong/p/template.html
Copyright © 2011-2022 走看看