zoukankan      html  css  js  c++  java
  • 05.Django模板层

    Django模板层

    01.模板语法之变量
      <h4>{{s}}</h4> # str
      <h4>列表:{{ l.0 }}</h4> # 列表
      <h4>列表:{{ l.2 }}</h4> # 列表
      <h4>字典:{{ dic.name }}</h4> # 字典
      <h4>日期:{{ date.year }}</h4> # date = datetime.date(1993, 5, 2) 日期对象
      <h4>类对象列表:{{ person_list.0.name }}</h4> # [obj1, obj2, obj3....]


    02.模板之过滤器
      语法:{{obj|filter__name:param}}

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

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

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

    slice
    如果 value="hello world"
    {{ value|slice:"2:-1" }}

    truncatechars
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
    用于简介
    参数:要截断的字符数
    例如:
    {{ value|truncatechars:9 }}

    safe
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。
    但是有的时候我们可能不希望这些HTML元素被转义
    value="<a href="">点击</a>"
    {{ value|safe}}


    03.模板之标签

      (1)for ... empty
      {% for person in person_list %}
      <p>{{ person.name }}</p>

      {% empty %} # 如果没有person_list
      <p>sorry,no person here</p>
      {% endfor %}

    (2)forloop循环序号可以通过{{forloop}}显示
      1.forloop.counter:
      总是一个表示当前循环的执行次数的整数计数器。
      这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。
      {% for item in todo_list %}
      <p>{{ forloop.counter }}: {{ item }}</p>
      {% endfor %}

    2.forloop.counter0:
    类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

    3.forloop.revcounter:
    是表示循环中剩余项的整型变量。 在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。
    最后一次循环执行中,这个变量将被置1。

    4.forloop.revcounter0
    类似于 forloop.revcounter ,但它以0做为结束索引。
    在第一次执行循环时,该变量会被置为序列的项的个数减1。

    5.forloop.first
    是一个布尔值,如果该迭代是第一次执行,那么它被置为```` 在下面的情形中这个变量是很有用的
    {% for object in objects %}
    {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
    {{ object }}
    </li>
    {% endfor %}

    6.forloop.last
    是一个布尔值;在最后一次执行循环时被置为True。 一个常见的用法是在一系列的链接之间放置管道符(|)
    {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
    上面的模板可能会产生如下的结果:
    Link1 | Link2 | Link3 | Link4
    另一个常见的用途是为列表的每个单词的加上逗号。
    Favorite places:
    {% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}

    (3)if 标签
      {% if num > 100 or num < 0 %}
      <p>无效</p>
      {% elif num > 80 and num < 100 %}
      <p>优秀</p>
      {% else %}
      <p>凑活吧</p>
      {% endif %}

    (4)with
      使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)
      很多次的时候是非常有用的 with name=xxxxx

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

     

    04.自定义标签和过滤器
    1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

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

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

     1 from django import template
     2 from django.utils.safestring import mark_safe # 让传输的html为安全,浏览器不进行转译
     3 register = template.Library() #register的名字是固定的,不可改变 
     4 @register.filter # 用于在html中改变原有的值{% num|函数名 参数 %}
     5   def filter_multi(v1,v2):
     6   return v1 * v2
     7 
     8 @register.simple_tag # 用于在html中生成原html中没有的值{% 函数名 参数 参数%}
     9 def simple_tag_multi(v1,v2):
    10   return v1 * v2
    11 
    12 @register.simple_tag
    13 def my_input(id,arg):
    14   result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    15   return mark_safe(result)
    16 
    17 @register.inclusion_tag("classification.html") # 括号可以引入模板
    18   def get_classification_style(username):
    19 '''
    20 执行完查询语句后,返回return给classification.html这个模板
    21 :param username: 需要views.py中进行传入
    22 :return: 带数据的html
    23 '''
    24   user_obj = models.UserInfo.objects.filter(username=username).first() # 查看用户是否存在可用.exists()
    25 
    26   blog_obj = user_obj.blog
    27   print("blog", blog_obj)
    28   cate_list = models.Category.objects.filter(blog=blog_obj).values("pk").annotate(c=Count("article__title")).values("title", "c")
    30   print('cate', cate_list)
    31   tag_list = models.Tag.objects.filter(blog=blog_obj).values("pk").annotate(c=Count("article__title")).values("title","c")
    33   print('tag', tag_list)
    34 
    35   date_list = models.Article.objects.filter(user=user_obj).extra(
    36   select={"y_m_date": "strftime('%%Y-%%m', create_time)"}).values("y_m_date").annotate(c=Count("nid")).values("y_m_date", "c")
    39   print('date', date_list)
    40 
    41   return {"blog_obj": blog_obj, "cate_list": cate_list, "tag_list": tag_list, "date_list": date_list,"username": username}

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

    5.使用simple_tag和filter(如何调用)
      # num=12
      {{ num|filter_multi:2 }} #24
      {{ num|filter_multi:"[22,333,4444]" }}
      {% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
      {% simple_tag_multi num 5 %}

      *注意:filter可以用在if等语句后,simple_tag不可以

      {% if num|filter_multi:30 > 100 %}
      {{ num|filter_multi:30 }}
      {% endif %}


    05.模板继承 (extend)

    {% 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 %}

    为了更好的可读性,你也可以给你的{% endblock %} 标签一个 名字 。例如:

    {% block content %}
    ...
    {% endblock content %}


    在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。

    不能在一个模版中定义多个相同名字的 block 标签。

    06.路径模板{% staic url%}

      static为settings.py配置的STATIC_URL

      css:
      <link rel="stylesheet" href="{% static 'blog/css/highlights/github.css' %}">
      js:
      <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
  • 相关阅读:
    validform使用
    kindeditor使用
    初探uni-app
    【心有猛虎】react-lesson
    【心有猛虎】react-pxq
    【水滴石穿】douban-movies-react-native
    【水滴石穿】MyFirstRNDemo
    【水滴石穿】github_popular
    笔记本CPU的型号和类型的区分方法
    List<T>的IndexOf方法和Remove方法
  • 原文地址:https://www.cnblogs.com/QQL-anatkh/p/9597517.html
Copyright © 2011-2022 走看看