Django之template

一.介绍

在HTML的基础上加上模板语言(包括:会被替换掉的变量和标签)

二.模板语法之变量( {{ }} )

2.1 基本用法

 views:

def index(request):
    import datetime
    s="hello"
    l=[111,222,333]    # 列表
    dic={"name":"yuan","age":18}  # 字典
    date = datetime.date(1993, 5, 2)   # 日期对象
 
    class Person(object):
        def __init__(self,name):
            self.name=name
 
    person_yuan=Person("yuan")  # 自定义类对象
    person_egon=Person("egon")
    person_alex=Person("alex")
 
    person_list=[person_yuan,person_egon,person_alex]
 
 
    return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})

template:

<h4>{{s}}</h4>

#通过'.'引用
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>类对象列表:{{ person_list.0.name }}</h4>

#通过'.'引用对象的方法
<h4>字典:{{ dic.name.upper }}</h4>

2.2 过滤器

 语法:

{{ 变量|过滤器:参数 }}
#加法
{{ i|add:5}}

#如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值
{{ value|default:"nothing" }}

#返回值的长度。它对字符串和列表都起作用
{{ value|length }}

#将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
{{ value|filesizeformat }}

#如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d" }}

#切片
{{ value|slice:"2:-1" }}

#截断字符串。截断的字符串将以可翻译的省略号序列(“...”)结尾。
{{ value|truncatechars:9 }}

#截断word。截断的word将以可翻译的省略号序列(“...”)结尾
{{ value|truncatewords:2 }}

'''
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
'''
value="<a href="">点击</a>"

{{ value|safe}}

 

三.模板语法之标签( {% %} )

3.1 标签操作

#for循环
{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}
#for...empty
{% for person in person_list %}
    <p>{{ person.name }}</p>
  <p>{{ forloap.counter }}</p> #表示for循环的序号
{% empty %} <p>sorry,no person here</p> {% endfor %}
#if
{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}
#url
{{% url ... %}}
#include继承
{% include 'xxx.html' %}

3.2 模板继承

模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

先建立一个母板

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

利用母板的html:

{% extends "base.html" %}
 
{% block title %}My amazing blog{% endblock %}
 
{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

 四. 自定义过滤器和自定义标签

1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

2、在app中创建templatetags模块(模块名只能是templatetags)

3、创建任意 .py 文件,如:my_tags.py

from  django import template
register=template.Library()

#自定义过滤器
@register.filter
def mul_filter(x,y):
    return x*y

#自定义标签
@register.simple_tag
def mul_tag(x,y,z):
    return x*y*z

4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

 

{% load my_tags %}

5、调用simple_tag和filter

# num=12
{{ num|mul_filter:2 }} #24
 
{{ num|mul_filter:"[22,333,4444]" }}
 
{% mul_tag 2 5 6 %}  参数不限,但不能放在if for语句中
{% mul_tag num 5 %}
过滤器特点:最多接收两个参数,可以放在控制语句中

标签的特点:不能放在控制语句中使用,参数不限
                <p>{{ i|mul_filter:12}}</p>
                <p>{{ i|add:12}}</p>
                <p>{% mul_tag i 12 %}</p>
                <p>
                   {% if i|mul_filter:10 > 100 %}
                       <span>100</span>
                   {% else %}
                       <span>{{ i }}</span>
                   {% endif %}
                </p>
                <p>
                   {% if {% mul_tag i 12 %} %}
                   
                   {% endif %}
                </p>
View Code

自定义标签结合include使用:

@register.inclusion_tag('blog/menu.html')
def get_menu(username):
    import datetime, pytz
    blog_user = UserInfo.objects.filter(username=username).first()
    time_now = datetime.datetime.now()
    time_now = time_now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
    interval = (time_now - blog_user.create_time).days
    category_list=Category.objects.filter(blog=blog_user.blog).annotate(c=Count('article')).values_list('title','c')
    Tag_list=Tag.objects.filter(blog=blog_user.blog).annotate(c=Count('article')).values_list('title','c')
    archive_list=Article.objects.filter(user=blog_user).extra(select={'archive_time':"strftime('%%Y-%%m',create_time)"})\
        .values('archive_time').annotate(c=Count('nid')).values_list('archive_time','c')
    return locals()

 

posted @ 2018-01-27 08:41  Hantaozi  阅读(168)  评论(0编辑  收藏  举报