zoukankan      html  css  js  c++  java
  • WebFramework-Basis-3rd

    周一,晴,记录生活分享点滴

    参考博客1:https://www.cnblogs.com/yuanchenqi/articles/6083427.html

    参考博客2:https://www.cnblogs.com/5poi/p/6649101.html

    Django 1.3

    Template(模板)

    模版的组成

    HTML代码+逻辑控制代码

    模版的渲染

    >>> python manange.py shell  (进入该django项目的环境)
    >>> from django.template import Context, Template
    >>> t = Template('My name is {{ name }}.')
    >>> c = Context({'name': 'Stephane'})
    >>> t.render(c)
    'My name is Stephane.'

    逻辑控制代码的组成

    变量

    语法格式:使用双大括号来引用变量

    {{var_name}}

    Template和Context对象

    >>> python manange.py shell  (进入该django项目的环境)
    >>> from django.template import Context, Template
    >>> t = Template('My name is {{ name }}.')
    >>> c = Context({'name': 'Stephane'})
    >>> t.render(c)
    'My name is Stephane.'
    ​
    ​
    # 同一模板,多个上下文,一旦有了模板对象,你就可以通过它渲染多个context,无论何时我们都可以
    # 像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染会更为高效:
    # Low
    for name in ('John', 'Julie', 'Pat'):
        t = Template('Hello, {{ name }}')
        print t.render(Context({'name': name}))
    ​
    # Good
    t = Template('Hello, {{ name }}')
    for name in ('John', 'Julie', 'Pat'):
        print t.render(Context({'name': name}))

    推荐方式

    from django.shortcuts import render,HttpResponse
    from django.template.loader import get_template #记得导入
    # Create your views here.
    import datetime
    from django.template import Template,Context
    ​
    ​
    # 推荐写法 -------------------------------------------------------------------------------------------
    def current_time(req):
        now=datetime.datetime.now()
        return render(req, 'current_datetime.html', {'current_date':now})
    ​
    ​
    # 原始的视图函数(不推荐)------------------------------------------------------------------------------
    def current_time(req):
        now=datetime.datetime.now()
        html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now
        return HttpResponse(html)
    ​
    ​
    # django模板修改的视图函数(不推荐)---------------------------------------------------------------------
    def current_time(req):
        now=datetime.datetime.now()
        t=Template('<html><body>现在时刻是:<h1 style="color:red">{{current_date}}</h1></body></html>')
        t=get_template('current_datetime.html')
        c=Context({'current_date':now})
        html=t.render(c)
        return HttpResponse(html)

    句点号(深度变量的查找)

    # 后端数据 :
    s = 'hello'
    s1 = [1,2]
    s2 = { 'user':'eriic' }
    s3 = time.localtime()
    s4 = Foo( 'eroiic' , 20 )
     
    # 页面取值 :
    {{ obj.1 }}       # 索引取值
    {{ obj.user }}    # 根据字段key取值
    {{ obj.year }}    # 根据属性取值
    {{ obj.name }}    # 取类中字段

    Filter(过滤器)

    语法格式

    {{obj|filter:param}}

    方法

    add              # 给变量加上相应的值
    addslashes       # 给变量中的引号前加上斜线
    capfirst         # 首字母大写
    cut              # 从字符串中移除指定的字符
    date             # 格式化日期字符串
    default          # 如果值是False,就替换成设置的默认值,否则就是用本来的值
    default_if_none  # 如果值是None,就替换成设置的默认值,否则就使用本来的值

    实例

    # value1="aBcDe"  -----------------------------------------------------
    {{ value1|upper }}
    ​
    # value2=5  -----------------------------------------------------------
    {{ value2|add:3 }}
    ​
    # value3='he  llo wo r ld'  -------------------------------------------
    {{ value3|cut:' ' }}
    ​
    # import datetime  ----------------------------------------------------
    # value4=datetime.datetime.now()
    {{ value4|date:'Y-m-d' }}
    ​
    # value5=[]  ----------------------------------------------------------
    {{ value5|default:'空的' }}     # 设置默认值
    # value6='<a href="#">跳转</a>'  -------------- 【有重点】 --------------
    {{ value6 }}                    # 字符串形式在页面显示
    ​
    {% autoescape off %}            # 渲染成浏览器能解析的标签
      {{ value6 }}
    {% endautoescape %}
    ​
    {{ value6|safe }}               # 效果同上(显示“跳转”链接)·【重点】
    ​
    {{ value6|striptags }}
    ​
    # value7='1234'  ------------------------------------------------------
    {{ value7|filesizeformat }}     # obj 数据的大小 ~kb
    {{ value7|first }}              # 取第一个值
    {{ value7|length }}             # 得到长度
    {{ value7|slice:":-1" }}        # 切片
    # value8='http://www.baidu.com/?a=1&b=3'  -----------------------------
    {{ value8|urlencode }}          # 进行url编码
    # value9='hello I am eriic'  ------------------------------------------
    {{ value9|truncatechars:'6' }}  # 按字符截断   总显示3个点, 占用3个位置!
    {{ value9|truncatewords:'6' }}  # 按单词截断

    标签(tag)的使用

    使用大括号和百分比的组合来表示使用tag

    {% tags %}

    1、{% if %} 的使用

    不允许同一标签里同时出现and和or,否则逻辑容易产生歧义

    {% if num >= 100 and 8 %}
    ​
    {% elif num < 100%}
        <p>num小于100</p>
    ​
    {% else %}
        <p>num等于100</p>
    ​
    {% endif %}

    2、{% for %}的使用

    {% for i in obj %}
    ​
    # obj 为列表 , i 为值
        {{ forloop.counter }}    # 模拟索引 , 从1开始算
        {{ forloop.counter0 }}   # 模拟索引 , 从0开始算
        {{ forloop.revcounter }} # 反序索引 , 从最后开始算
    # obj 为字典 , i 为key , 或者改为: obj.keys obj.values obj.items 进行循环
    ​
    {% endfor %}

    3、{%csrf_token%}

    csrf_token标签,放到 form 表单里,生成一个input标签,和其他表单标签一起提交给后台,用于防治跨站攻击验证。

    4、{% with %}

    用更简单的变量名替代复杂的变量名

    {% with total=fhjsaldfhjsdfhlasdfhljsdal %} 
        {{ total }}
    {% endwith %}

    5、{% verbatim %}

    禁止变量被渲染

    {% verbatim %}
        {{ hello }}              # 页面直接显示 {{ hello }}
    {% endverbatim %}

    6、{% load %}

    加载标签库

    自定义filter和simple_tag·重点

    1. 首先在setting中installed_apps 添加当前的app项目

      # settings.py
      ​
      INSTALLED_APPS = [
          ...
          "app01"
      ]
    2. app项目下创建templatetags/tags(名字是固定的,不能变)

    3. 创建任意文件 如 my_tags.py

    4. 引入类,自定义函数

      from django import template
      from django.utils.safestring import mark_safe
      
      register = template.Library()   # register的名字是固定的,不可改变
      
      # filter 
      @register.filter      
      def filter_multi(v1,v2):
          return  v1 * v2
      
      # simple_tag
      @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)
    5. HTML中使用

      {% load my_tags %}       # 引入外部文件, 位置在最上面
      # 使用:
      {% my_add 100 101 %}     # simple_tag 可以传入多个参数, 不能用于if语句
      {{ obj | my_add:num2 }}  # filter 最多两个参数, if 语句可以跟filter

    模版继承

    include 模板标签 {% include %}

    该标签允许在(模板中)包含其它的模板的内容。

    标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。

    每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。

    extend(继承)模板标签

    减少共用页面区域所引起的重复和冗余代码

    • 方法一:解决该问题的传统做法是使用服务器端的 includes ,在 HTML 页面中使用该指令将一个网页嵌入到另一个中。

    • 方法二:模板继承是先构造一个基础框架模板,然后在其子模板中对它所包含站点公用部分和定义块进行重载。

    #1 -- base.html     存放的是页面共有的代码
    ....
    {% block content %}      # 非共有部分用 block代替, block名字(content)自定义 
        ...
    {% endblock %}
    ​
    ​
    #2 -- order.html    只保留非公有部分的代码
    {% extend 'base.html' %}   # 继承外部文件,引入模板,位置放在最上面
    {% block cotent %}         # 非公有部分的代码, 会对base.html中的block进行替换
        .... 
    {% endblock %}             # 没有对应上的 block 会在base中原样显示
    # 如果需要同时显示父级的代码 和自己代码 可以嵌套使用
    {{ block.super }}

    day55 

  • 相关阅读:
    c++语法(2)
    c++语法(1)
    前端之 BOM和DOM
    JavaScript
    CSS属性相关(续)
    CSS属性相关
    CSS选择器
    前端之CSS
    HTML常用标签
    HTML介绍
  • 原文地址:https://www.cnblogs.com/chungzhao/p/13292783.html
Copyright © 2011-2022 走看看