Django---模版层

一 模版简介

你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python代码之中。

def current_datetime(request):
    now = datetime.datetime.now()
    html = "It is now %s." % now
    return HttpResponse(html)

尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。 让我们来看一下为什么:

  • 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。

  • Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。

  • 程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。

基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题

** python的模板:HTML代码+模板语法**

def current_time(req):
    # ================================原始的视图函数
    # import datetime
    # now=datetime.datetime.now()
    # html="现在时刻:

%s.

" %now # ================================django模板修改的视图函数 # from django.template import Template,Context # now=datetime.datetime.now() # t=Template('现在时刻是:

{{current_date}}

') # #t=get_template('current_datetime.html') # c=Context({'current_date':str(now)}) # html=t.render(c) # # return HttpResponse(html) #另一种写法(推荐) import datetime now=datetime.datetime.now() return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})

模版语法重点:

变量:{{ 变量名 }}

1 深度查询 用句点符

2 过滤器

标签:{{% % }}

二 模版语法之变量

在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法:{{变量名}}

views.py

def template_test(request):
    name = 'lqz'
    li = ['lqz', 1, '18']
    dic = {'name': 'lqz', 'age': 18}
    ll2 = [
        {'name': 'lqz', 'age': 18},
        {'name': 'lqz2', 'age': 19},
        {'name': 'egon', 'age': 20},
        {'name': 'kevin', 'age': 23}
    ]
    ll3=[]
    class Person:
        def __init__(self, name):
            self.name = name

        def test(self):
            print('test函数')
            return 11

        @classmethod
        def test_classmethod(cls):
            print('类方法')
            return '类方法'

        @staticmethod
        def static_method():
            print('静态方法')
            return '静态方法'

    lqz = Person('lqz')
    egon = Person('egon')
    person_list = [lqz, egon]
    bo = True
    te = test()
    import datetime
    now=datetime.datetime.now()
    link1='点我'
    from django.utils import safestring
    link=safestring.mark_safe(link1)
    # html特殊符号对照表(http://tool.chinaz.com/Tools/htmlchar.aspx)

    # 这样传到前台不会变成特殊字符,因为django给处理了
    dot='♠'


    # return render(request, 'template_index.html', {'name':name,'person_list':person_list})
    return render(request, 'template_index.html', locals())

html

{{ name }}

{{ li }}

{{ dic }}

{{ lqz }}

{{ person_list }}

{{ bo }}

{{ te }}


深度查询句点符

{{ li.1 }}

{{ dic.name }}

{{ lqz.test }}

{{ lqz.name }}

{{ person_list.0 }}

{{ person_list.1.name }}


过滤器

{#注意:冒号后面不能加空格#}

{{ now | date:"Y-m-d H:i:s" }}

{#如果变量为空,设置默认值,空数据,None,变量不存在,都适用#}

{{ name |default:'数据为空' }}

{#计算长度,只有一个参数#}

{{ person_list |length }}

{#计算文件大小#}

{{ 1024 |filesizeformat }}

{#字符串切片,前闭后开,前面取到,后面取不到#}

{{ 'hello world lqz' |slice:"2:-1" }}

{{ 'hello world lqz' |slice:"2:5" }}

{#截断字符,至少三个起步,因为会有三个省略号(传负数,1,2,3都是三个省略号)#}

{{ '刘清政 world lqz' |truncatechars:"4" }}

{#截断文字,以空格做区分,这个不算省略号#}

{{ '刘清政 是 大帅比 谢谢' |truncatewords:"1" }}

{{ link1 }}

{{ link1|safe }}

{{ link }}

{{ dot }}

{#add 可以加负数,传数字字符串都可以#}

{{ "10"|add:"-2" }}

{{ li.1|add:"-2" }}

{{ li.1|add:2 }}

{{ li.1|add:"2" }}

{{ li.1|add:"-2e" }}

{#upper#}

{{ name|upper }}

{{ 'LQZ'|lower }}


模版语法之标签

{#for 循环 循环列表,循环字典,循环列表对象#} {% for foo in dic %} {{ foo }} {% endfor %} {#也可以混用html标签#} {% for foo in li %}
    foo
{% endfor %}
{#表格#} {% for foo in ll2 %} {% endfor %}
{{ foo.name }} {{ foo.age }}
{#'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}#} {% for foo in ll2 %} {% endfor %}
{{ forloop.counter }} {{ foo.name }} {{ foo.age }}
{% for foo in ll5 %}

foo.name

{% empty %}

空的

{% endfor %}

if判断

{% if name %}
hi {{ name }} 注销 {% else %} 请登录 注册 {% endif %} {#还有elif#}

with

{% with ll2.0.name as n %} {{ n }} {% endwith %} {{ n }} {% load my_tag_filter %} {{ 3|multi_filter:3 }} {#传参必须用空格区分#} {% multi_tag 3 9 10 %} {#可以跟if连用#} {% if 3|multi_filter:3 > 9 %}

大于

{% else %}

小于

{% endif %}

注意:句点符也可以用来引用对象的方法(无参数方法):

字典:{{ dic.name.upper }}<``/``h4>

你可能感兴趣的:(Django---模版层)