第三章:Django的模板使用

时间:2022-07-21 05:35:16

一、关于django中模板渲染数据的基本认识

  • 1、语法:{{变量名}}
  • 2、变量名是由字母、数字、下划线组成且首字符不能是数字
  • 3、变量的名称不能是python或者django中的关键词或者保留字
  • 4、可以传递字典、模型、方法、函数、列表到前端模板
  • 5、django只能以字典的形式传递数据到前端模板

二、传递变量到前端页面

  • 1、在模板渲染中使用context关键字传递一个对象

    def index2(request):
    return render(request, 'book1.html',context={'name':'张三'})
    <h2>Hi,{{ name }}</h2>
  • 2、直接传递一个字典

    def index2(request):
    return render(request, 'book1.html',{'name':'张三'})
  • 3、传递一个函数,传递的函数不需要调用

    from datetime import datetime
    def index2(request):
    return render(request, 'book1.html',{'date':datetime.now})
    <p>{{ date }}</p>
  • 4、传递一个方法(在类中的函数叫方法)

    class Person():
    def __init__(self, name, age):
    self.name = name
    self.age = age

    def sayName(self):
    return '我的名字叫:%s' % self.name

    def index2(request):
    p = Person('张三',20)
    return render(request, 'book1.html', {'person': p.sayName})
    <p>{{ person }}</p>
  • 5、传递一个模型(类)

    class Person():
    def __init__(self, name, age):
    self.name = name
    self.age = age

    def sayName(self):
    return '我的名字叫:%s' % self.name

    def index2(request):
    p = Person('张三',20)
    return render(request, 'book1.html', {'person': p})
    <p>{{ person.sayName }}</p>
    <p>{{ person.name }}</p>
    <p>{{ person.age }}</p>
  • 6、传递一个列表到前端

    def index2(request):
    books = ['三国演义','红楼梦','西游记','水浒传']
    return render(request, 'book1.html', {'books': books})
    <p>{{ books }}</p>

三、过滤器的使用

过滤器实质就是一个函数,有django自带的过滤器也可以自己定义过滤器,过滤器的作用是:对变量进行过滤,在真正渲染变量之前进行处理,然后得出的结果替换原来的变量展现的结果

  • 1、语法

    <p>{{ name | 过滤器名称}}</p>
  • 2、变量与过滤器中间使用管道符号|

  • 3、一个变量可以使用多个管道符号
  • 4、前面说过滤器是一个函数,自然可以传递参数,直接在过滤器名称后面使用冒号:(注意中间不能有空格)

    <p>{{ name | cut:" " }}</p>

四、django中常见的过滤器

  • 1、add:如果是数字就添加,如果是字符串就拼接,否则就空的

    <p>{{ books | add:2}}</p>
  • 2、default:当变量为False的时候就显示(pythonFalse的情况空字符串、None)

    <p>{{ books | default:'hello word'}}</p>
  • 3、default_if_none:这个只能是变量为None的时候才显示

  • 4、first:表示一个列表中第一个
  • 5、last:表示一个列表中最后一个
  • 6、date:格式化日期和时间

    • Y表示四位数的年
    • y表示二位数的年
    • m表示两位数的月
    • n表示一位数的月
    • d表示两位数的日
    • J表示一位数的日
    • h表示两位十二小时制的小时
    • H表示两位的二十四小时制的小时
    • i表示分钟
    • s表示秒
    def index2(request):
    return render(request, 'book1.html', {'date': datetime.now})
    <p>{{ date | date:'Y-m-d H:i:s' }}</p>
  • 7、joinpython中一样的用法

    def index2(request):
    books = ['a','b','c']
    return render(request, 'book1.html', {'books': books})
    <p>{{ books | join:',' }}</p>
  • 8、length返回字符串或者数组的长度

    def index2(request):
    books = ['a','b','c']
    return render(request, 'book1.html', {'books': books})
    <p>{{ books | length }}</p>
  • 9、length_is判断一个字符串或者数组返回的长度是否为指定的

    <p>{{ books | length_is:3 }}</p>
  • 10、truncatechars表示字符串过长的时候会根据指定的长度截取,后面用...表示(长度包括三个点)

  • 11、capfirst首字符大写
  • 12、slice切割列表(前包括后面不包括)

    <p>{{ books | slice:'2' }}</p>
  • 13、striptags去除全部的html标签

  • 14、safe会关闭变量的自动转义(传递脚本可以执行)
  • 15、floatformat浮点数的格式化

五、模板中的判断与循环(记住要有结束符合)

  • 1、if判断

    def index2(request):
    return render(request, 'book1.html', {'age': 24})
    {% if age > 20 %}
    <p>年龄大于20</p>
    {% else %}
    <p>年龄小于20</p>
    {% endif %}
  • 2、for..in..遍历数组(列表)

    def index2(request):
    books = ['三国演义','西游记','红楼梦','水浒传']
    return render(request, 'book1.html', {'books': books})
    {% for book in books %}
    <li>{{ book }}</li>
    {% endfor %}
  • 3、关于for循环中的补充

    • 1、forloop.counter表示迭代的次数,从1开始
    • 2、forloop.counter0表示迭代的次数,从0开始
    • 3、forloop.revcounter表示下标从大到小,从1开始
    • 4、forloop.revcounter0表示下标从大到小,从0开始
    • 5、forloop.first返回布尔值,如果是第一次迭代就返回true否则是false
    • 6、forloop.last返回布尔值,如果是最后一次迭代就返回true否则是false
    • 7、forloop.parentloop用于多层for循环,放回上一层的以上的

六、关于页面的跳转

  • 1、在urls.py中定义name

    from django.conf.urls import url
    import views
    urlpatterns = [
    url(r'^$', views.index,name='book_index'),
    url(r'^book/', views.index1),
    ]
  • 2、在一个页面中使用url进行跳转

    <a href="{% url 'book_index' %}">跳转到页面一</a>

七、页面跳转传递参数

  • 1、在urls.py中定义name和传递参数的

    from django.conf.urls import url
    import views
    urlpatterns = [
    url(r'^$', views.index,name='book_index'),
    url(r'^book/(?P<bookid>\d+)$', views.index1,name='book_list'),
    ]
  • 2、在前端页面中定义跳转,并传递参数

    <a href="{% url 'book_list' bookid='10' %}">跳转</a>
  • 3、接收参数

    def index1(request,bookid='0'):
    print '传递的参数',bookid
    books = ['三国演义', '西游记', '红楼梦', '水浒传']
    return render(request, 'book1.html', {'books': books})

八、模板的继承

  • 1、子模板继承父模板用extends必须在第一行

    {% extends 'base.html' %}
  • 2、在父模板中定义block用于子模块调用

    {% block 模块名称 %}

    {% endblock %}
  • 3、子页面中直接调用父模板中的模块

    {% block 模块名称 %}

    {% endblock %}
  • 4、说明:子模块中内容必须写在模块中,否则不现实

九、使用include引入公用页面(头部和尾部)

  • 1、定义头部或者尾部页面(要去除html)
  • 2、在模块中使用include

    {% include 'book.html' %}

十、加载静态文件

  • 1、查看settings.py文件中是否加载(一般是存在的)

    INSTALLED_APPS = [
    ...
    'django.contrib.staticfiles',
    ...
    ]
  • 2、有两种方法存放静态文件

    • 1、在创建的组件(app)下面直接创建一个static文件夹
    • 2、在根目录下创建一个static文件夹
  • 3、在组件中创建一个static的使用方式

    • 1、在页面顶部(子模板必须是在继承的下面)

      {% load static %}
    • 2、直接引入静态文件(会直接从static文件夹开始查找)

      <link rel="stylesheet" href="{% static 'index.css' %}">
      <img src="{% static 'images/png-Angular2-by-StuQ.png' %}"/>
  • 4、在根目录中创建static文件夹

    • 1、 在settings.py底部配置静态文件的路径(可以是相对路径,绝对路径,OS查找)

      STATICFILES_DIRS = (
      'static',
      )
    • 2、使用方式跟上面的使用方式一样的

    • 3、注意settings.py头部加上# -*- coding: utf-8 -*-编码,否则中文注释也会报错