模板之母版、继承、导入、自定义函数

模板

母版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block titile %}{% endblock %}</title>
    <link rel="stylesheet" href="/static/commons.css">
    <style>
        .pg-header{
            height: 50px;
            background-color: gold;
            color: white;
        }
    </style>
    {% block css %}{% endblock %}
</head>
<body>
    <div class="pg-header">母版</div>
    {% block context %}{% endblock %}
    <script src="/static/jquery.js"></script>
    {% block js %}{% endblock %}
</body>
</html>

继承

extends

书写顺序无要求,仅能继承一个母版

{% extends 'master.html' %}

{% block title %}母版使用{% endblock %}

{% block context %}
    <span>用户名</span>
    <input type="text" name="user" placeholder="用户名" />
{% endblock %}

{% block js %}
    <script>
        alert('123');
    </script>
{% endblock %}

{% block css %}
    <style>
        body{
            background-color: blue;
        }
    </style>
{% endblock %}

导入

include

可导入多个

{% block context %}
    <span>用户名</span>
    <input type="text" name="user" placeholder="用户名"/>
    {% include 'tag.html' %}
    {% include 'tag.html' %}
{% endblock %}

自定义函数

  • simple_tag

    • 优点:参数个数无限制,空格间隔,空格个数无限制
    • 缺点:不可作为模板if的条件
    1. app下创建templatetags目录

    2. 在templatetags目录下,创建任意py文件(文件名任意,例如spring.py)

    3. 在py文件中,创建template对象 register

    4. 在py文件中,装饰函数

       @register.simple_tag
       def my_define_func(a, b):
           return a + b
      
    5. settings中注册APP

    6. 在html文件,第一行添加 {% load spring %}

    7. 在html文件,body中写 {% 函数名 arg1 arg2 %}

    例如: app的templatetags目录下的spring.py

      	from django import template
      	from django.utils.safestring import mark_safe
      	
      	register = template.Library()
      	
      	
      	@register.simple_tag
      	def my_define_func(a, b):
      	    return a + b
    
      simple.html
      	
      	{% load spring %}
      	<!DOCTYPE html>
      	<html lang="en">
      	<head>
      	    <meta charset="UTF-8">
      	    <title></title>
      	</head>
      	<body>
      	    {{ name }}
      	    <br/>
      	    {{ name|lower }}
      	    <br/>
      	    {% my_define_func 5 2 %}
      	</body>
      	</html>
    
      urls.py
      	url(r'^simple$', views.simple),
    
      views.py
      	def simple(request):
      	    name = "Tom"
      	    return render(request, 'simple.html', {'name': name})
    
      settings.py
      	INSTALLED_APPS = [
      	    'django.contrib.admin',
      	    'django.contrib.auth',
      	    'django.contrib.contenttypes',
      	    'django.contrib.sessions',
      	    'django.contrib.messages',
      	    'django.contrib.staticfiles',
      	    'app01',
      	]
    
      若html使用继承
    
      	{% extends 'master.html' %}
      	{% load spring %}
      									
      	{% block context %}
      	    <span>用户名</span>
      	    <input type="text" name="user" placeholder="用户名" />
      	    {{ "PM"|my_filter:"LiLi" }}
      	{% endblock %}
    
  • filter

    • 缺点:最多传递2个参数,且不能加空格;若传递多个参数,可以将多个参数组成一个,当成参数2传递,在函数内处理
    • 优点:可以作为模板if的条件
    • 使用方法:
      • {{ 参数|函数名 }}
      • {{ 参数1|函数名:参数2 }}

    例如:

      html
      	{{ "PM"|my_filter:"LiLi" }}
    
      app的templatetags目录下的spring.py
      	@register.filter
      	def my_filter(a, b):
      	    return a + b
      
      其它与simple_tag一样
    
  • 自定义分页

    前端处理

      {{ page_str|safe }}
    
      page_str = """
          <a href="/page/?p=1">1</a>
          <a href="/page/?p=2">2</a>
          <a href="/page/?p=3">3</a>
      """
    

    后端处理

      {{ page_str }}
    
      from django.utils.safestring import mark_safe
    
      page_str = """
          <a href="/page/?p=1">1</a>
          <a href="/page/?p=2">2</a>
          <a href="/page/?p=3">3</a>
      """
      page_str = mark_safe(page_str)
    
posted @ 2018-04-10 22:34  12兵哥哥  阅读(260)  评论(0编辑  收藏  举报