zoukankan      html  css  js  c++  java
  • Django模板

    MVC框架和MTV框架

    MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

    Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

    Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

    Django的MTV模式

            Model(模型):负责业务对象与数据库的对象(ORM)

            Template(模版):负责如何把页面展示给用户

            View(视图):负责业务逻辑,并在适当的时候调用Model和Template

            此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,           view再调用相应的Model和Template

    Django框架图示

    Django模板系统

    模板用法之变量 (.) 的用法

    Django模板中只需要记住俩种特殊符号:

    {{ }} 和 {% %}

    {{ }}表示变量,在模板渲染的时候替换成值,{% %} 标签 表示逻辑相关的操作。

    变量

    {{ 变量名 }}

    变量名由字母数字和下划线组成。

    点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^template_test/',views.template_test),
    [
    View Code

    view中代码

    from django.shortcuts import  render
    
    class Person:           #定义一个类
                def __init__(self,name,age):
                         self.name=name
                         self.age=age
                def eat (self):
                        return '正在吃草'
                def __str__(self):
                       return '<Person : {} - {} >'.format(self.name,self.age)
    
    def  template_test (request):    #定义一个函数
                  string='张张'
                  age=83
                  sex_direction=['小小' , '大大']   #取向
            dic={'name' : "张张" ,"pwd" : 'zz'}
    
                p1=Person('小小',17)
    
               return render(request,"template_test.html" ,
                                        {
                                            " string" : string,
                                            "age" : age,
                                             "sex_direction" : sex_direction ,
                                             "dic" : dic ,
                                             'p1' : p1
                                        })
    View Code

    模板中支持的写法:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
          {{string}} 
         <br>
          {{age}}
         <br>               
          {{sex_direction.0}} {{sex_direction.1}}  #.索引就能拿到对应的值
         <br>
          {{dic}}   {{dic.name}}    {{dic.pwd}}
         <br>
          {{dic.keys}}
         <br>
          {{dic.values}}
         <br>
          {{dic.items}}
         <br>
          {{p1}}    {{p1.name}}     {{p1.age}}   {{p1.eat}}
    </body>
    </html>
    View Code

    注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

    1. 在字典中查询
    2. 属性或者方法
    3. 数字索引

    模板语法之过滤器 Filters   

    翻译为过滤器,用来修改变量的显示结果。

    语法: {{ value|filter_name:参数 }}  #参数最多一个

    '|'左右没有空格没有空格没有空格

    default

    {{ value|default:"nothing"}}
    

    如果value值没传的话就显示nothing

    注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。

    filesizeformat

    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:

    {{ value|filesizeformat }}
    

    例子:

    views.py中:

    def  template_test (request):    
               return render(request,"template_test.html" ,
                                        {
                'filesize' : 1                        # 1 bytes                                        
                   'filesize' : 1*1024               #1.0KB
                                               'filesize' : 1*1024 *1024     #1.0MB
                                        }
    View Code

    模板中:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
         {{filesize|filesizeformat}}
    
    </body>
    </html>
    View Code

    如果 value 是 123456789,输出将会是 117.7 MB。

    add

    给变量加参数

    {{ value|add:"2" }}       value是数字4,则输出结果为6。  
    

    也可以做字符串的拼接

    {{ first|add:second }}    如果first是 [1,.2,3] ,second是 [4,5,6] ,那输出结果是 [1,2,3,4,5,6] 。
    

    lower

    {{ value|lower }}   小写 

    upper

    {{ value|upper}}    大写

    title

    {{ value|title }}   标题

    ljust

    "{{ value|ljust:"10" }}"   左对齐

    rjust

    "{{ value|rjust:"10" }}"   右对齐

    center

    "{{ value|center:"15" }}"  居中

    length

    {{ value|length }}
    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

    slice

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

    first

    {{ value|first }}        取第一个元素

    last

    {{ value|last }}         取最后一个元素

    join

    {{ value|join:" // " }}   使用字符串拼接列表。同python的str.join(list)。

    truncatechars

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

    参数:截断的字符数

    {{ value|truncatechars:9}}
    

    date

    {{ value|date:"Y-m-d H:i:s"}}     日期格式化
    

     views.py:

    from django.shortcuts import render
    import dateime
    
    
    def  template_test (request):   
            
                now = datetime.datetime.now()
        
               return render(request,"template_test.html" ,
                                        {
                          
                                        'now' : now,
                                        })        
    View Code

     模板中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    时间:{{now}}
     </body>
    </html>
    View Code

     在setts.py中做好位置直接{{now}}就可以了

     

    safe

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,
    比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,
    如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器
    “|safe”的方式告诉Django这段代码是安全的不必转义。 比如: value = "<a href='#'>点我</a>" {{ value|safe}}

    Tags 标签

    for

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
    </ul>
    

    for循环可用的一些参数:

    Variable                                                             Description
    
    forloop.counter                                      当前循环的索引值(从1开始)
    
    forloop.counter0                                    当前循环的索引值(从0开始)
    
    forloop.revcounter                                 当前循环的倒序索引值(从1开始)     
    
    forloop.revcounter0                                当前循环的倒序索引值(从0开始)         
    
    forloop.first                                            当前循环是不是第一次循环(布尔值)
    
    forloop.last                                            当前循环是不是最后一次循环(布尔值)
    
    forloop.parentloop                                  本层循环的外层循环
    View Code

    for ... empty

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% empty %}
        <li>空空如也</li>
    {% endfor %}
    </ul>
    

    if,elif和else

    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}
    

    当然也可以只有if和else 

    {% if user_list|length > 5 %}
      七座豪华SUV
    {% else %}
        黄包车
    {% endif %}
    

    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

    with

    定义一个中间变量  

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

    跨站请求伪造和csrf_token

    csrf_token

    这个标签用于跨站请求伪造保护。

    在页面的form表单里面写上{% csrf_token %}

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^form/', views.form),
        ]
    View Code

    views.py

    def  form(request):
           {% csrf_token %}
           return render(request, 'form.html ')
    View Code

    模板

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form  action=' '  method='post' >
            <button>提交<button>
    </body>
    </html>
    View Code

    在在页面的form表单里面写上{% csrf_token %} 就可以提交post 请求了

    母板和继承即组件

    母版

    注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

    继承母版

    在子页面中在页面最上方使用下面的语法来继承母板。

    {% extends 'layouts.html' %}
    

    块(block)

    通过在母板中使用{% block  xxx %}来定义"块"。

    在子页面中通过定义母板中的block名来对应替换母板中相应的内容。

    组件

    可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

    {% include 'navbar.html' %}
    

     静态文件相关

  • 相关阅读:
    491 · 回文数
    936 · 首字母大写
    1343 · 两字符串和
    1535 · 转换成小写字母
    13 · 字符串查找
    146 · 大小写转换 II
    241 · 转换字符串到整数(容易版)
    46 · 主元素
    kotlin协程——>通道
    kotlin协程——>异步流
  • 原文地址:https://www.cnblogs.com/baoshuang0205/p/10305515.html
Copyright © 2011-2022 走看看