• python的Web框架,Django模板变量,过滤器和静态文件引入


    HTML模板的路径查找

    在setting中设置查找路径:

    1 #默认的查找在此处填写,优先级最高,为在manage.py的同级路径中,添加(常规是template)文件夹,在(template)文件夹中配置HTML文件
    2 
    3 默认路径地址:
    4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     1 TEMPLATES = [
     2     {
     3         'BACKEND': 'django.template.backends.django.DjangoTemplates',
     4         
     5         #优先查找的路径'DIR',对其进行拼接。
     6         'DIRS':[os.path.join(BASE_DIR,'templates')]
     7         
     8         #如果此处为True,则会查找INSTALLED_APPS内注册的目录路径下,会在app下的templas文件夹中寻找
     9         'APP_DIRS':Ture
    10     
    11         'OPTIONS': {
    12             'context_processors': [
    13                 'django.template.context_processors.debug',
    14                 'django.template.context_processors.request',
    15                 'django.contrib.auth.context_processors.auth',
    16                 'django.contrib.messages.context_processors.messages',
    17             ],
    18         },
    19     },
    20 ]

    如果APP_DIRS为True,则会在'DIRS'找完之后,在'INSALLSE_APPS'的列表目录下寻找

     1 INSTALLED_APPS = [
     2     #注册目录
     3     'teacher.apps.TeacherConfig'
     4     'teacher':可以如此简写
     5     
     6     'django.contrib.admin',
     7     'django.contrib.auth',
     8     'django.contrib.contenttypes',
     9     'django.contrib.sessions',
    10     'django.contrib.messages',
    11     'django.contrib.staticfiles',
    12 ]

    只要找到了符合的模板就返回,不再向下继续找了,所以优先级和路径很重要


     

    静态页面,动态页面

    静态页面是没有改变,获取到网页后,是固定样式的; 动态页面是和服务器有交互的页面,在与服务器交互后,返回的页面会有不同的页面返回给浏览器

    context 模板变量

    view中传递数据给html页面,命名规则不能以下划线开头,其他同python,变量的值可以是任何数据类型

     context={'key':value}
    
        例:
         #view文件内配置传送:
         def index(request):
             now = datetime.now()
             return render(request, 'index.html',context={
                    'nows':now
                    #此处对应的字典传送给index.html
                })
                
        # index模板文件内配置接受:
         <body>
            <h2>当前时间为:{{nows}}</h2>
            #此处的nows是对应的view文件中的key
         </body>

    时间格式设置,设置的时间格式并不是我们想要的时区时间,就需要修改时间的参数。

        setting中设置:
    1 TIME_ZONE = 'Asia/Shanghai'

    模板变量各种方法:

    html接受的语法及输出的结果:下列的列表、字典、函数等需要再views文件中配置才可以接受

     1 <body>
     2     列表:lt = [1,2,3]
     3         <p>我是一个列表:{{lt}}</p>   
     4         输出:[1,2,3]
     5         <p>我是列表中的第二个值:{{lt.2}}</p>
     6         输出:2
     7         
     8 
     9     函数:
    10     <p>我是一个函数:{{func}}</p>
    11     输出:函数的结果
    12     
    13     
    14     字典:dt = {'name':'hong','age':18,'items':'abc'}
    15     <p>我是一个字典:{{dt}}</p>
    16     输出:{'name':'张三','age':18}
    17     <p>我是字典的一个值:{{dt.name}}</p>
    18     输出:张三
    19     
    20 
    21 
    22     其他异议的字典输出:
    23     <p>调用字典的一个方法{{dt.items}}</p>
    24     输出:abc;  如果字典中没有'items'这个键,则返回的是items的这个字典方法
    25         1.首先键值对查找;然后属性或方法调用
    26     
    27 
    28 
    29     总结:
    30         1、计算变量,将其替换为结果
    31         2、遇到(.)的时候,按照以下顺序查找:
    32             -1.字典的键值对
    33             -2.属性或者方法查找
    34             -3.数字索引查找
    35         3、如果结果是可调用的,则调用它时不带参数,调用的结果为模板的值
    36         
    37         **渲染失败返回空**
    38 </body>

    模板过滤器

    传递的参数例子,为一下内容提供参数例子

    1 now = datetime.now()
    2 
    3 lt = [1,2,3]
    4 
    5 dt = {'name':'张三','age':18,'items':'aBc','text':'i an hua'}
    6 
    7 def func()
    8     return '我是一个函数'
    日期,时间的格式化date,time
    以上列代码传送的参数 时间now为例:
    1  <body>
    2         <p>当前日期时间{{now|date:"Y年m月d日 H时i分s秒"}}</p>
    3         <p>当前时间{{now|time:"H时i分s秒"}}</p>
    4     </body>
    输出格式的结果为:
    1    当前日期时间2019年02月20日 11时53分11秒
    2     当前时间11时53分11秒

    date和time过滤器格式

    Y:四位数的年。如:1999
    y:两位数的年。如:99
    m:两位数的月。如:01, 09
    n:一位数的月。如:1, 9, 12
    d:两位数的日。如:01, 09, 31
    j:一位数的日。如:1, 9, 12
    g:12小时制的一位数小时。如:1, 9 ,12
    G:24小时制的一位数小时。如:0, 8 ,23
    h:12小时制的两位数小时。如:01, 09, 12
    H:24小时制的两位数小时。如:01, 13, 24
    i:分钟。从00-59
    s:秒。从00-59
    add:将参数与值相加,首先尝试转换成整数相加,如果失败,则尝试其他多有可能,{{value|add:'value'}}
    1     <p>1列表值的相加:{{ lt.1|add:'3' }}</p>
    2     
    3     <p>2列表值的相加:{{ lt.1|add:'3.5' }}</p>
    4     <p>2列表值的相加:{{ lt.1|add:3.5 }}</p>
    5     
    6     <p>函数的值为{{ func|add:'haha' }}</p>

    输出结果

    1     1列表值的相加:5
    2     
    3     2列表值的相加:
    4     2列表值的相加:5
    5     #add后面的值如果是str类型不是整数则渲染失败,返回为空,如果是int类型则会转成整数再相加
    6     
    7     3函数的值为:我是一个函数haha
    capfirst:首字母大写
    1     <p>首字母的大小写方法:{{ dt.items|capfirst }}</p>

    输出结果

    1     首字母的大小写方法:ABc
    default:如果变量解析失败,则返回给定的默认值,当value是''空字符串,也会输出默认值。
     1 例子
     2 def func(aa):
     3     return '带参数的函数'
     4 def func():
     5     return '''
     6 def func(aa):
     7     return None
     8     
     9 
    10     <p>解析失败则返回默认值:{{ func|default:"nothing" }}</p>

    输出结果

    1         解析失败则返回默认值:nothing
    first,last:第一个元素和最后一个元素
    1     <p>列表的第一个元素:{{ lt|first }}</p>
    2     <p>列表的最后一个元素:{{lt|last}}</p>

    输出结果

    1     列表的第一个元素:1
    2     列表的最后一个元素:3
    slice:切片
    1     <p>我是列表的倒序:{{ lt|slice:"::-1"}}</p>

    输出结果:

    1     我是列表的倒序:[3,2,1]
    join:连接字符串列表,与str.join(list)一样
    1     <p>把字典的value连接起来:{{ dt.name|join:"xxx"}}</p>

    输出结果

    1     把字典的value连接起来:张xxx三
    floatformat:浮点数格式化,不指定小数位参数,默认保留一位
        value                   Template                  Output(结果)
        34.23234         {{ value|floatformat}}             34.2
        34.23234         {{ value|floatformat:3}}           34.232
    length,length_is:返回字符串或列表的长度
    1     <p>列表的长度是:{{ lt|length}}</p>
    2     <p>列表的长度是{{ le|length }}?:{{ lt|length_is:3 }}</p>

    输出结果

    1     列表的长度是:3
    2     列表的长度是3吗?:True
    lower, upper :字符串中的字符都变小写和大写
    1     <p>字符都变小写:{{ dt.items|lower }}</p>
    2     <p>字符都变大写:{{ dt.items|upper }}</p>

    输出结果

    1     字符都变小写:abc
    2     字符都变大写:ABC
    title:标题化,首字母大写
    1     <p>title标题化:{{ dt.text|title }}</p>

    输出结果:

    1     title标题化:I Am Hua

    过滤器可以用链式的方式:

        只要能够解析出来,就可以接多个的过滤器
    {{func
    |default:"nothing"|add:"haha"}}
    safe:关闭变量的自动转义,使html标签生效,xss跨域脚本攻击

    反射型和存储型,因为浏览器会解析css和js,所以django帮我们管理这方面的问题。

        js = '<script>alert("1")</script>'
        html = '<h3>我是安全的,需要渲染成html</h3>'
    
        <p>{{ html|safe }}</p>
    
        添加了safe后,才会执行这段代码,而不是转义成文本格式。

      我是安全的,需要渲染成html


    静态文件

    settings文件中设置静态文件路径的配置

        默认是static,但也可以更改为其他
    
    1     STATIC_URL = '/static/'
        同时在manage文件的当前目录下,创建static文件夹,在其文件下创建app的文件夹,用于管理静态文件(css,js,img等……)
    1     STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

    静态文件的引入

    -硬编码

        在css文件夹下创建了同名的css文件。然后在html中的head内引入文件
        html代码
    1     <head>
    2         <link rel="stylesheet" href="/abab(和setting中的STATIC_URL对应)/teacher/css/index.css">
    3     </head>

    -模板标签,动态解析

        在html的首行(第一行代码)
        html代码
    1     {% load static %}
    2     
    3     <head>
    4         <link rel="stylesheet" href="{% static 'teacher/css/index.css' %}">
    5     </head>
    
    
  • 相关阅读:
    [BJOI2016] 回转寿司
    [洛谷P4115] Qtree4 & [ZJOI2007] 捉迷藏
    [POI2011] METMeteors
    [NOI2020] 命运
    [20220404联考] 条条下水道通祖安
    相机丢图解决方案
    网卡一些设置,摘自百度文库
    设置 Qtabwidget 窗体透明
    DevExpress RibbonControl菜单组底部怎么去掉 学无止境
    Python篇:某宝毫秒级的精准秒杀
  • 原文地址:https://www.cnblogs.com/hua888/p/10407094.html
Copyright © 2020-2023  润新知