12-20笔记

template两大功能

  • template中可以使用for,if等语句
  • template可以使用模板继承

变量的过滤器(filter)的使用

语法格式: {{obj|filter:param}}
   # 1  add         :   给变量加上相应的值
   # 2  addslashes  :    给变量中的引号前加上斜线
   # 3  capfirst    :    首字母大写
   # 4  cut          :   从字符串中移除指定的字符
   # 5  date         :   格式化日期字符串
   # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
   # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值
#实例:
#value1="aBcDe"
{{ value1|upper }}<br>
#value2=5
{{ value2|add:3 }}<br>
#value3='he  llo wo r ld'
{{ value3|cut:' ' }}<br>
#import datetime
#value4=datetime.datetime.now()
{{ value4|date:'Y-m-d' }}<br>
#value5=[]
{{ value5|default:'空的' }}<br>
#value6='<a href="#">跳转</a>'
{{ value6 }}
{% autoescape off %}
  {{ value6 }}
{% endautoescape %}
{{ value6|safe }}<br>
{{ value6|striptags }}
#value7='1234'
{{ value7|filesizeformat }}<br>
{{ value7|first }}<br>
{{ value7|length }}<br>
{{ value7|slice:":-1" }}<br>
#value8='http://www.baidu.com/?a=1&b=3'
{{ value8|urlencode }}<br>
    value9='hello I am yuan'

static配置(js,css静态文件存放位置)

#  STATIC_URL的含义与MEDIA_URL类似。STATIC文件还可以配置STATICFILES_DIRS,指定额外的静态文件存储位置。
# ----------------------------------------------------------------------------
#注意1:
    #为了后端的更改不会影响前端的引入,避免造成前端大量修改
    STATIC_URL = '/static/'               #引用名
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR,"statics")  #实际名 ,即实际文件夹的名字
    )
    #django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找
    #<script src="/statics/jquery-3.1.1.js"></script>
    #------error-----不能直接用,必须用STATIC_URL = '/static/':
    #<script src="/static/jquery-3.1.1.js"></script>
#注意2(statics文件夹写在不同的app下,静态文件的调用):
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        ('hello',os.path.join(BASE_DIR,"app01","statics")) ,
    )
    #<script src="/static/hello/jquery-1.8.2.min.js"></script>
#注意3:
    STATIC_URL = '/static/'
    {% load staticfiles %}
   # <script src={% static "jquery-1.8.2.min.js" %}></script>

simple_tag

  • 当Django的自带的方法不够用时,可以自定义一些方法
    注意
    a、在app中创建templatetags模块(必须的)
    b、创建任意 .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

@register.simple_tag
def simple_tag_multi(v1,v2):
    return  v1 * v2

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
d、使用simple_tag和filter(如何调用)

-------------------------------.html
{% load my_tags %}   #首行
 # 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 %}

e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
注意:
register.filter可以用在if等语句后,但register.simple_tag不可以

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

extend模板继承

  • 在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?
    Django 解决此类问题的首选方法是使用一种优雅的策略—— 模板继承。
    本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。
  1. 第一步是定义 基础模板,该框架之后将由子模板所继承
    这个叫做 base.html 的模板定义了一个简单的 HTML 框架文档,
    我们将在本站点的所有页面中使用。
    子模板的作用就是重载、添加或保留那些块的内容
    我们使用模板标签: {% block %} 。 所有的 {% block %} 标签告诉模板引擎
    ,子模板可以重载这些部分。 每个{% block %}标签所要做的是告诉模板引擎,
    该模板下的这一块内容将有可能被子模板覆盖。
#base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>
  1. 继承base模板
{% extends "base.html" %}
{% block title %}The current time{% endblock %}
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

base模板可以被多次调用

{% extends "base.html" %}
{% block title %}Future time{% endblock %}
{% block content %}
<p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
{% endblock %}
  1. 模板继承使用方式
<1>如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

<2>一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,
 因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。
 
 <3>如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。  
 如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。
 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
 
 <4>不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block标签的工作方式是双向的。
 也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。
 如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。

猜你喜欢

转载自blog.csdn.net/qq495966654/article/details/85234521