django-模板语法

        一、模板语法之变量    : {{ value }}

  在后台,在渲染HTML页面时,以字典的形式把变量传给前端  

  在前端,模板变量({{  }})内写python代码,相应的数据会展示在HTML之上

# urls
path('template/', views.template),

# views
def template(request):
    import datetime
    date = datetime.datetime.now()
    return render(request, 'test/template.html', {'date': date})

# html
<input type="text" placeholder="{{ date }}">
<div>时间:{{ date }}</div>

 

       二、模板语法之过滤器    : {{ value|filter_name: param }}

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

{{ value|default:"nothing" }}

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

{{ value|length }}

  date:对datetime类型的时间进行格式化,如果 value=datetime.datetime.now()

{{ value|date:"Y-m-d" }}   <!--2018-03-12-->

  slice:切片,索引a到索引b,如果 value="hello world"

{{ value|slice:"2:-1" }}

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

{{ value|truncatechars:9 }}

  safe:把后台传的字符串按照HTML标签的规则解析

value="<a href="">点击</a>"

{{ value|safe}}    <!--得到一个a标签-->

 

       三、模板语法之标签    : {{ value|filter_name: param }}

for 标签:循环

  其中empty为可选项,for循环也可与{{ forloop }}配合使用

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}
forloop.counter            The current iteration of the loop (1-indexed)
forloop.counter0           The current iteration of the loop (0-indexed)
forloop.revcounter         The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0        The number of iterations from the end of the loop (0-indexed)
forloop.first              True if this is the first time through the loop
forloop.last               True if this is the last time through the loop
{{forloop.***}}

 

if 标签

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

with 标签:给一个变量起别名

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

 

       四、自定义标签和过滤器      

  1、在app中创建templatetags目录(目录名只能是templatetags)

  2、目录下创建任意py文件(如my_tags.py)

  from django import template
  from django.utils.safestring import mark_safe
  register = template.Library()   #register的名字是固定的,不可改变  
  @register.filter
  def filter_multi(v1,v2):
      return  v1 * v2
  <br>
  @register.simple_tag
  def simple_tag_multi(v1,v2):
      return  v1 * v2
  <br>
  @register.simple_tag
  def my_input(id,arg):
      result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
      return mark_safe(result)

  3、在html文件中使用自定义标签和过滤器是,需导入它们所在的py文件,方法

{% load my_tags %}

  4、使用

  -------------------------------.html
  {% load xxx %}        
  # 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不可以。filter最多可接收两个参数

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

 inclusion_tag

 

       四、HTML的模板继承      

父模板:一个完整的HTML文件,其中可以创建若干{% block  block_name %} {% endblock %}标签

子文件:清空HTML标签,在首行使用   {% extends '父模板' %}  ,来继承父模板的所有HTML代码,它告诉模版引擎,这个模版“继承”了另一个模版,子文件在block标签中写自己的HTML{% block  block_name %}    <div><\div>   <p></p>  <input   />   {% endblock %}

<!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>
父模板
{% 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 %}
子文件

 

posted @ 2018-07-19 00:45  web123  阅读(106)  评论(0编辑  收藏  举报