zoukankan      html  css  js  c++  java
  • 10 模板层

    编辑本博客

    yuan先生博客

    模板语法和变量

     模板语法:

    • {{}}  渲染变量用
    • {%%}   渲染标签用

    渲染变量{{ }}

    • 深度查询,局点符
      return render(request,"app04template/index.html",{"name":name,"age":age,"ls":ls,"info":info,"b":b,"p1":p1,"p2":p2,"person_list":person_list})
      #等同于上面传值方法,传值较多可直接用locals()方法
      return render(request,"app04template/index.html",locals())
      View Code

       tml页面

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>app04template</title>
      </head>
      <body>
      <h1>{{ name }}</h1>
      <h1>{{ age }}</h1>
      <h1>{{ ls }}</h1>
      <h1>{{ info }}</h1>
      <h1>{{ b }}</h1>
      <h1>{{ p1 }}</h1>
      <h1>{{ p2 }}</h1>
      <h1>{{ person_list }}</h1>
      </body>
      </html>
      View Code
    • 用句点号进行深度查询,列表用.index方式查询的时候,从0开始
      <h1>{{ name }}</h1>
      <h1>{{ age }}</h1>
      <h1>{{ ls }}</h1>
      <h1>{{ ls.1 }}</h1>
      <h1>{{ info }}</h1>
      <h1>{{ info.a }}</h1>
      <h1>{{ b }}</h1>
      <h1>{{ p1 }}</h1>
      <h1>{{ p2 }}</h1>
      <h1>{{ person_list }}</h1>
      <h1>{{ person_list.1.name }}</h1>
      <h1>{{ person_list.1.age }}</h1>
      View Code

    渲染标签{% %}

    模板过滤器

    把视图传过来的数据进行过滤,修饰等之后再进行显示,用竖杠(|)方法

    语法:

    {{ obj|filter_name:param }}

    用过滤器修改日期显示格式

    未用过滤器效果

    添加date过滤器

    <p>{{ now|date:"Y-m-d" }}</p>

    过滤器调整时间显示格式

    默认过滤器:

    • default:如果一个变量为空,则给定默认值,参数为给定的默认值
    • length:返回变量长度,只对列表和字符串生效
    • filesizeformat:将文件大小格式化成可读的显示方式,如10KB,5.2MB等
    • date:格式化时间显示方式,参数为Y-m-d
    • slice:对数据进行切片,如value|slice:"2:-1"
    • fruncatechars:对字符串按指定长度进行截断,多余部分显示为...,如value|truncatechars:9
    • fruncatewords:按单词进行截断
    • safe:为了安全起见,django的模板中会对HTML标签和JS等语法标签进行转义,不希望被转义,则用safe过滤器,无参数
    • add:加法过滤器,加上指定参数,如number|add:100
    • upper:小写转大写

    个别字段需要展示html,无需前台用safe标签过滤器,可以用mark_safe

    from django.utils.safestring import mark_safe

    return mark_safe('<input type="checkbox" name="pk" />')

    模板标签

     for标签

    forloop.counter记录遍历序号

    <body>
        <p>----------for标签语法---------</p>
        <p>遍历列表</p>
        {% for i in ls %}
            <p>{{ i }}</p>
        {% endfor %}
            <p>遍历字典</p>
        {% for i in info %}
            <p>{{ i }}</p>
        {% endfor %}
            <p>遍历对象列表</p>
        {% for p in person_list %}
            <p>{{ forloop.counter }} {{ p.name }}</p>
        {% endfor %}
    </body>
    View Code

    for ...empty标签

    for标签带有一个可选的{% empty %}从句,以便在给出的组是空或者未找到时有所操作

    <body>
        {% for person in person_list %}
            <p>{{ person.name }}</p>
            {% empty %}
                <p>no person here</p>
        {% endfor %}
    </body>
    View Code

    if标签

    <body>
    {% if user %}
        <p>欢迎{{ user }}登录</p>
        {% else %}
        <p>登录  注册</p>
    {% endif %}
    </body>
    View Code

    with标签

    用一个简单的名字缓存一个复杂的变量

    <body>
        {% with person_list.1.name as pname %}
            {{ pname }}
        {% endwith %}
    </body>
    View Code

    scrf_token标签

    提供跨域请求保护机制

    模板中添加scrf_koten标签

    <form action="{% url 'app03:index' %}" method="post">
        {% csrf_token %}
        <input type="text" name="name" placeholder="姓名">
        <input type="text" name="age" placeholder="年龄">
        <input type="submit" value="提交">
    </form>
    View Code

    自定义标签和过滤器

    •  在settings中注册app,INSTALLED_APPS列表中添加模块名

    • 在app下新建templatetags模块,模块名不能改

     

    • 创建任意py文件写过滤器
    from django import template
    register=template.Library()
    
    #自定义乘法过滤器
    @register.filter
    def multi_filter(x,y):
        return x*y
    View Code
    • load自定义模块后即可使用
    <body>
    <p>自定义乘法过滤器</p>
    {% load myTagFilter %}
    {{ i|multi_filter:10 }}
    </body>
    View Code
    • 自定义乘法标签
    #自定义乘法标签
    @register.simple_tag
    def multi_tag(x,y):
        return x*y
    View Code
    • 使用过滤器,如果乘以10后大于200,则显示200,否自显示自身
      <p>自定义乘法过滤器</p>
      {% load myTagFilter %}
      {{ i|multi_filter:10 }}
      {% if i|multi_filter:10 > 200 %}
          <p>200</p>
          {% else %}
          <p>{{ i }}</p>
      {% endif %}
      View Code
    • 代码中调用乘法标签,记得load
      <body>
      <p>自定义乘法标签</p>
      {% multi_tag 10 10 %}
      </body>
      View Code

    过滤器和标签区别

    • 过滤器只能接收两个参数
    • 标签可以传递多个参数
    • 标签不能放置到if等判断语句

    继承标签

    include 从一个html页面中导入另一个html文件

    <body>
        {% include "advertise.html" %}
    </body>
    View Code

    继承:

    • 创建模板页面,包含导航等公用区域,在被填充区域添加block盒子,一个html页面中可以预留多个盒子
      {% block con %}
      {% endblock %}
    • 创建子页面,用extends方法继承,重写block con盒子内容。
      {% extends "base.html" %}
      {% block con %}
      <!--子页面用来填充父页面con部分的html代码-->
      {% endblock %}

    从一个页面中导入另一个文件的部分区域,即重写父盒子的block区域

    保留父盒子内容,子盒子的block前面加{{ block.super }},

    注意:

    • extends必须放置在首行
    • 盒子尽量多预留,并写入默认值,没有被重写则显示默认内容

     inclusion_tag注册HTML代码

    一个模板中有一块数据是在之后的每个页面中出现的。

    方式一:在每个视图函数中返回对应数据

    方式二:inclusion_tag方法,让模板通过“过滤器”自动获取数据和渲染,实现数据和代码重用

    • 在app下新建一个templatetags的py包,注册后需要重启服务,否则提示not registered
    • 在包中自己创建一个py文件,用来写“过滤器”
    • 在py文件中导入需要的模块,这里需要的模块包含获取数据所需模块

    • 定制标签模板,用来渲染自己的数据
      <div>
          <div class="panel panel-warning">
              <div class="panel-heading">我的标签</div>
              <div class="panel-body">
                  {% for tag in tag_list %}
                      <p><a href="/{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>
                  {% endfor %}
              </div>
          </div>
          <div class="panel panel-danger">
                  <div class="panel-heading">随笔分类</div>
                  <div class="panel-body">
                      {% for cate in cate_list %}
                          <p><a href="/{{ username }}/category/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
                      {% endfor %}
                  </div>
              </div>
          <div class="panel panel-danger">
                  <div class="panel-success">随笔归档</div>
                  <div class="panel-body">
                      {% for date in date_list %}
                          <p><a href="/{{ username }}/archive/{{ date.0 | date:'Y-m' }}">{{ date.0 | date:'Y-m' }}({{ date.1 }})</a></p>
                      {% endfor %}
                  </div>
              </div>
      </div>
      View Code
    • 自定义获取数据的方法,返回字典数据,这个字典类似渲染模板的字典
    • 装饰自定义的方法,并给装饰器传入html模板,这个模板用来渲染自定义方法返回的数据
      @register.inclusion_tag('classification.html')
      def get_classification_style(username):
          user = models.UserInfo.objects.filter(username=username).first()
          print(user)
          blog = user.blog
          cate_list = models.Category.objects.filter(blog=blog).annotate(c=Count('article__nid')).values_list('title', 'c')
          tag_list = models.Tag.objects.filter(blog=blog).values('pk').annotate(c=Count('article__title')).values_list('title', 'c')
          date_list = models.Article.objects.filter(user=user).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('nid')).values_list('month', 'c')
          return {'username':username,'blog': blog, "cate_list": cate_list, "tag_list": tag_list, 'date_list': date_list}
      View Code
    • 在html中像调用过滤器一样调用,返回的是被渲染过的html标签。即在html中添加html标签

    这里的username即是自定义方法所需参数

  • 相关阅读:
    C#的dll被其他程序调用时,获取此dll正确的物理路径
    用鼠标右键选择DataGridView单元格或行
    当心回车符破坏你的JSON数据
    WinForm中当TextBox重新获得焦点时输入法失效问题
    django-rest-framework登陆认证
    django-celery定时任务以及异步任务and服务器部署并且运行全部过程
    linux安装mysqlclient报错
    Dajngo的CBV和FBV
    五分钟看懂Celery定时任务
    Nginx+uWsgi生产部署Django
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9236038.html
Copyright © 2011-2022 走看看