• 11.15 知识总结(模板层、模型层)


    一、 模板层

      1.1 过滤器

             1.什么是过滤器?

    过滤器类似于python的内置函数,用来把变量值加以修饰后再显示。

          2. 语法

    1、
    {{ 变量名|过滤器名 }}

    2、链式调用:上一个过滤器的结果继续被下一个过滤器处理
    {{ 变量名|过滤器1|过滤器2 }}

    3、有的过滤器取需要参数
    {{ 变量名|过滤器名:传给过滤器的参数 }}

         3. 常用内置过滤器

    #0、default
    #作用:如果一个变量值是False或者为空、None,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing”
    {{ value|default:"nothing" }}

    #1、default_if_none
    #作用:如果只针对value是None这一种情况来设置默认值,需要使用default_if_none
    #只有在value=None的情况下,才会输出“None..
    .”,
    {{ value|default_if_none:"None..." }}

    #2、length
    #作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用,如果value是 ['a', 'b', 'c', 'd'],那么输出是4
    {{ value|length }}

    #3、filesizeformat
    #作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等),如果 value 是 12312312321,输出将会是 11.5 GB
    {{ value|filesizeformat }}

    #4、date
    #作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),按照格式Y-m-d则输出2019-02-02 
    {{ value|date:"Y-m-d" }}  

    #5、slice
    #作用:对输出的字符串进行切片操作,顾头不顾尾,如果value=“egon“,则输出"eg"
    {{ value|slice:"0:2" }} 

    #6、truncatechars
    #作用:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾,如果value=”hello world egon 嘎嘎“,则输出"hello...",注意8个字符也包含末尾的3个点
    {{ value|truncatechars:8 }}

    #7、truncatewords
    #作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词,如果value=”hello world egon 嘎嘎“,则输出"hello world ..."
    {{ value|truncatewords:2 }}

    1.2  标签

        1. 标签的作用

    1、一些标签用来在输出中创建文本
    2、一些标签用来进行流程控制(执行循环或者if判断)
    3、一些标签用来将外部信息加载到模板中以供以后的变量使用

        2. 格式

    # 1、
    {% 标签名 %}

    # 2、大多数标签都需要接收参数
    {% 标签名 参数1 参数2 %}

    # 3、一些标签需要有开始{% tag %}和结束标记{% endtag %}
    {% 标签名 %}
    ...内容...
    {% end标签名 %}

       3 .常用的标签之for标签

    1、遍历每一个元素:
    {% for person in person_list %}
       

    {{ person.name }}


    {% endfor %}

    2、可以利用{% for obj in list reversed %}反向循环。

    3、遍历一个字典:
    {% for key,val in dic.items %}
       

    {{ key }}:{{ val }}


    {% endfor %}

    4、循环序号可以通过{{ forloop }}显示 
    forloop.counter            当前循环的索引值(从1开始)
    forloop.counter0           当前循环的索引值(从0开始)
    forloop.revcounter         当前循环的倒序索引值(从1开始)
    forloop.revcounter0        当前循环的倒序索引值(从0开始)
    forloop.first              当前循环是第一次循环则返回True,否则返回False
    forloop.last               当前循环是最后一次循环则返回True,否则返回False
    forloop.parentloop         本层循环的外层循环

    5、for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句
    {% for person in person_list %}
       

    {{ person.name }}

    {% empty %}
       

    sorry,no person here


    {% endfor %}

    了解:Django框架的for循环,没有break和continue方法,可以使用自定义过滤器实现forloop | continue和forloop | break,参考:https://djangosnippets.org/snippets/2093/

    4.  常用标签之if标签

     1、注意:
    {% if 条件 %}条件为真时if的子句才会生效,条件也可以是一个变量,if会对变量进行求值,在变量值为空、或者视图没有为其传值的情况下均为False

     2、具体语法
    {% if num > 100 or num < 0 %}
       

    无效


    {% elif num > 80 and num < 100 %}
       

    优秀


    {% else %}
       

    凑活吧


    {% endif %}

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

    4、判断条件中可以引入过滤器
    {% if athlete_list|length > 1 %}
       Team: {% for athlete in athlete_list %} ... {% endfor %}
    {% else %}
       Athlete: {{ athlete_list.0.name }}
    {% endif %}

    过滤器length返回的数字可用于与数字进行比较,除此之外大多数过滤器返回的都是字符串并不能用于与数字比较

    5、补充标签firstof
    针对下述多分支
        {% if var1 %}
            {{ var1 }}
        {% elif var2 %}
            {{ var2 }}
        {% elif var3 %}
            {{ var3 }}
        {% endif %}

    可以简写为一行
        {% firstof var1 var2 var3 %}

    也可以定义一个备用值,当var1、var2、var3均无值的时使用
    {% firstof var1 var2 var3 "fallback value" %}

    5. 常用标签之with标签

    with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
    {% with li.1.upper as v %}
        {{ v }}
    {% endwith %}

    1.3 模板的继承和导入

       1. 模板的导入之include标签

     作用:在一个模板文件中,引入/重用另外一个模板文件的内容,
    {% include '模版名称' %}

    2. 模板的继承\派生之extends标签、block标签

    #用:在一个模板文件中,引入/重用另外一个模板文件的内容
    {% extends "模版名称" %}
    #  也就是说include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容

    二、  模型层(跟数据库打交道的,重点核心)

          2.1 单表的操作

    1. create
    2. update
    3. delete
    4. all
    5. first
    6. filter
    7. # django自带的sqlite3数据库对日期格式不是很敏感 处理的时候容易出错
    8. # 增
    9. res = models.User.objects.create(name='jason',age=18,register_time='2002-1-21')
    10. print(res)
    11. import datetime
    12. ctime = datetime.datetime.now()
    13. user_obj = models.User(name='egon',age=84,register_time=ctime)
    14. user_obj.save()
    15. res = models.User.objects.filter(pk=2).delete()
    16. print(res)
    17. """
    18. pk会自动查找到当前表的主键字段 指代的就是当前表的主键字段
    19. 用了pk之后 你就不需要指代当前表的主键字段到底叫什么了
    20. uid
    21. pid
    22. sid
    23. ...
    24. """
    25. user_obj = models.User.objects.filter(pk=1).first()
    26. user_obj.delete()
    27. 修改
    28. models.User.objects.filter(pk=4).update(name='egonDSB')
    29. user_obj = models.User.objects.get(pk=4)
    30. user_obj = models.User.objects.filter(pk=6)
    31. """
    32. get方法返回的直接就是当前数据对象
    33. 但是该方法不推荐使用
    34. 一旦数据不存在该方法会直接报错
    35. 而filter则不会
    36. 所以我们还是用filter
    37. """
    38. user_obj.name = 'egonPPP'
    39. user_obj.save()

    2.2  常见的十几种查询方法

    必知必会13条
        # 1.all()  查询所有数据

        # 2.filter()     带有过滤条件的查询
        # 3.get()        直接拿数据对象 但是条件不存在直接报错
        # 4.first()      拿queryset里面第一个元素
        # res = models.User.objects.all().first()
        # print(res)
        # 5.last()
        # res = models.User.objects.all().last()
        # print(res)

        # 6.values()  可以指定获取的数据字段  select name,age from ...     列表套字典
        # res = models.User.objects.values('name','age')  #
        # print(res)
        # 7.values_list()  列表套元祖
        # res = models.User.objects.values_list('name','age')  #
        # print(res)
        # """
        #  # 查看内部封装的sql语句
        #  上述查看sql语句的方式  只能用于queryset对象
        #  只有queryset对象才能够点击query查看内部的sql语句
        #
        # """
        # 8.distinct()  去重
        # res = models.User.objects.values('name','age').distinct()
        # print(res)
        """
        去重一定要是一模一样的数据
        如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键
        
        """
        # 9.order_by()
        # res = models.User.objects.order_by('age')  # 默认升序
        # res = models.User.objects.order_by('-age')  # 降序
        #
        # print(res)
        # 10.reverse()  反转的前提是 数据已经排过序了  order_by()
        # res = models.User.objects.all()
        # res1 = models.User.objects.order_by('age').reverse()
        # print(res,res1)

        # 11.count()  统计当前数据的个数
        # res = models.User.objects.count()
        # print(res)
        # 12.exclude()  排除在外
        # res = models.User.objects.exclude(name='jason')
        # print(res)

        # 13.exists()  基本用不到因为数据本身就自带布尔值  返回的是布尔值
        # res = models.User.objects.filter(pk=10).exists()
        # print(res)

  • 相关阅读:
    CKA 真题练习(十六)备份还原etcd
    Hadoop 3.x(MapReduce)----【Hadoop 数据压缩】
    C++ 删除C盘中的用户(坑人必备,极度危险)
    算法通关村16关 | 滑动窗口如此简单
    Bigder:40/100 怎么组织一次用例评审
    offline RL | CQL:魔改 Bellman error 更新,得到 Q 函数 lower-bound
    解决caffe中的python环境安装的问题
    nodejs毕业设计商品|物品交互|互换平台二手shang‘c
    LeetCode216组合总和3
    还在手写SQL实现?试试MyBatis-Plus同款IDEA插件吧,提示太全了,还能一键生成代码~
  • 原文地址:https://blog.csdn.net/weixin_66010453/article/details/134420993