zoukankan      html  css  js  c++  java
  • Day60 Django框架--MVC框架简介&模板语言

    一,web框架中的MVC框架简介

      MVC框架:

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

     

    MTV框架:
        Model(模型):负责业务对象与数据库的对象(ORM)   --> Model = models.py
    
        Template(模版):负责如何把页面展示给用户  -->  View = html语言与模板语言
    
        View(视图):负责业务逻辑,并在适当的时候调用Model和Template  -->  Controller = views.py urls.py
    
        此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
    django的MTV框架本质上就是MVC框架

     

    二,Django的模板语言(HTML中的特殊符号)

      1.Django的模块系统是可以更换的。(第三方的jinja2)

      2.模板语言变量的用法,变量相关的用{{ 变量名 }},{% 逻辑相关 %}  

        1.当模板引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。

        2.变量名和Python变量名的命名规则一致

        3.变量用{{ 变量名 }}表示,注意:{和{之间不用加空格

        4.变量不传值默认显示空字符串

        5.点(.)在模板语言中有特殊的含义。

        6.当模板系统遇到点('.'),它将以这样的顺序查询:

          字典查询(Dictionary lookup):字典按key取值

          属性或方法查询(Attribute or method lookup):对象.属性/对象.方法

          数字索引查询(Numeric index lookup):索引取值

    1.如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
    2.如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串) 。
    注意事项
    {# html例子 #}
    
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>Django模板语言的语法</title>
    </head>
    <body>
        <p>{{ name }}</p>
        <p>{{ age }}</p>
        <hr>
        <p>字典按key取值</p>
        <p>{{ d1.name }}</p>
        <p>{{ d1.age }}</p>
        <p>如果属性或key和方法重名,优先显示属性</p>
        <p>{{ d1.items }}</p>
        <p>{{ d1.keys }}</p>
        <hr>
        <p>对象.属性</p>
        <p>{{ sb.name }}</p>
        <p>{{ sb.age }}</p>
        <p>对象.方法 不要加括号</p>
        <p>{{ sb.dream }}</p>
        <hr>
        <p>列表按索引取值</p>
        <p>{{ f5.3 }}</p>
        <p>{{ f5 }}</p>
        <hr>
        <p>支持链式操作</p>
        <p>{{ list2.1.name }}</p>
        <p>{{ list2.1.dream }}</p>
    </body>
    </html>
    {# django例子 #}
    
    from django.shortcuts import render
    
    def t(request):
        d1 = {'name':'alex','age':28,'items':'呵呵呵'}
    
        class Person:
            def __init__(self,name,age):
                self.name = name
                self.age = age
    
            @staticmethod
            def dream():
                return 'write the code,change the world'
    
        wxts = Person('alex',30)
    
        list1 = ['nezha','alex','eva','boss_jin','egon']
    
        p1 = Person('alex',18)
        p2 = Person('boss_jin',28)
        p3 = Person('egon',30)
        list2 = [p1,p2,p3]
    
        return render(
            request,
            't.html',
            {
                'name':'alex',
                'age':'18',
                'd1':d1,
                'sb':wxts,
                'f5':list1,
                'list2':list2
            }
        )

      

      3.filters(对变量做操作)

        1.语法

          1.{{ 变量名|filter_name }}

          2.{{ 变量名|filter_name:'参数' }}

        2.常用内置的filter筛选器

          1.default

    <p>如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值</p>
    <p>{{ age|default:'保密' }}</p>
    <p>{{ age }}</p>

          2.length

    <p>lenght:返回值的长度,作用于字符串和列表</p>
    <p>{{ name|length }}</p>

          3.filesizeformat

    <p>将值格式化为一个可读的文件尺寸(例如 '13 KB', '4.1 MB', '102 bytes')单bytes</p>
    <p>{{ file_size|filesizeformat }}</p>

          4.slice

    <p>{{ name|slice:'1:1' }}</p>
    <p>{{ name|slice:'1:-1' }}</p>

          5.date

    <p>date格式化,配合datetime模块</p>
    <p>{{ now }}</p>
    <p>{{ now|date:'Y-m-d H:i:s' }}</p>

          6.safe

    <p>模板语言中默认会对标签内容进行转义,使用"|safe"的方式告诉Django这段代码是安全的不必转义</p>
    <p>{{ a }}</p>
    <p>{{ a|safe }}</p>

          7.truncatechars、truncatewords

    <p>truncatechars:按照长度来区分。参数:截断的字符数,算上(...)字符长度</p>
    <p>truncatewords:按照空格区分不同的字。参数:在一定数量的字后截断字符串,不算上(...)字符长度</p>
    <p>{{ p }}</p>
    <p>{{ p|truncatechars:'5' }}</p>
    <p>{{ p_1|truncatewords:'5' }}</p>

          8.cut

    <p>cut:移除value中所有的与给出的变量相同的字符串</p>
    <p>{{ p_2|cut:'a' }}</p>

          9.join

    <p>join:使用字符串连接列表,例如Python的str.join(list)</p>
    <p>{{ list1|join:':' }}</p>

          10.timesince:将日期格式设为自该日期起的时间(例如:4天,6小时)

    <p>分钟是所使用的最小单位,对于相对于比较点的未来的任何日期,将返回“0分钟”。</p>
    <p>blog_date|timesince:comment_date:返回blog_date - comment_date</p>
    <p>{{ now|timesince:'' }}</p>
    <p>{{ now|timesince:'5' }}</p>

          11.timeuntil:

    <p>除了它测量从现在开始直到给定日期或日期时间的时间。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期实例,则{{ conference_date | timeuntil }}将返回“4周”。使用可选参数,它是一个包含用作比较点的日期(而不是现在)的变量。 如果from_date包含2006年6月22日,则以下内容将返回“1周”</p>
    <p>conference_date|timeuntil:from_date:返回from_date - conference_date</p>
    <p>{{ now|timeuntil:from_date}}</p>
    <p>{{ now|timeuntil:from_date:}}</p>

        3.自定义filter

          1.自定义filter的步骤

            1.在app下面新建一个python package名叫templatetags

            2.在上一步的python package中新建一个py文件

            3.在py文件中写一个函数,实现自定义的filter功能

            4.告诉django现在多了一个自定义的filter,在html文

    from django import template
    
    register = template.Library()
    
    @register.filter(name='dsb')  #设为dsb调用
    def sb(valure):
        return valure + 'sb'
    
    @register.filter()  #默认sb调用
    def sb(valure):
        return valure + 'sb'

            

          2.使用自定义的filter

            1.在HTML文件中导入刚才创建的py文件

    {# 先导入我们自定义filter那个文件 #}
    {% load app01_filters %}
    
    {# 使用我们自定义的filter #}
    {{ somevariable|cut:"0" }}
    {{ d.name|addSB }}
    HTML中导入自定义的filter文件

            2.重启django项目

            3.按照普通的filter调用自定义的函数

      4.tags带逻辑相关的

        1.for

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
    </ul>
    forloop.counter:当前循环的索引值(从1开始)
    forloop.counter0:当前循环的索引值(从0开始)
    forloop.revcounter:当前循环的倒序索引值(从1开始)
    forloop.revcounter0:当前循环的倒序索引值(从0开始)
    forloop.first:当前循环是不是第一次循环(布尔值)
    forloop.last:当前循环是不是最后一次循环(布尔值)
    forloop.parentloop:本层循环的外层循环
    for循环可用的一些参数

        2.for...empty

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

        

        3.if...elif...else

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

        

        4.if...else

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

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

        

        5.with

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

      5.csrt_token

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

    在页面的form表单标签里面写上
    {% csrf_token %} csrf(防止跨站请求伪造)攻击,对于POST提交的数据都要校验一下有没有特殊的字符串,字符串是否一致 对应settings.py文件中: MIDDLEWARE = [ 'django.middleware.csrf.CsrfViewMiddleware' ]
    1. Django的模板语言不支持连续判断,即不支持以下写法
    
    {% if a > b > c %}
    ...
    {% endif %}
    
    
    
    2. Django的模板语言中属性的优先级大于方法
    
    def xx(request):
        d = {"a": 1, "b": 2, "c": 3, "items": "100"}
        return render(request, "xx.html", {"data": d})
    
    如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中
    
    {{ data.items }} 默认会取d的items key的值
    django模板语言的小结

       

          

          

  • 相关阅读:
    BEC listen and translation exercise 44
    中译英12
    BEC listen and translation exercise 43
    中译英11
    BEC listen and translation exercise 42
    中译英10
    BEC listen and translation exercise 41
    中译英9
    BEC listen and translation exercise 40
    中译英8
  • 原文地址:https://www.cnblogs.com/lianyeah/p/9889640.html
Copyright © 2011-2022 走看看