zoukankan      html  css  js  c++  java
  • python全栈开发day64-模板-变量和(.)的使用,filters和自定义filter

    一、上周内容回顾

      

    day64
    内容回顾:
        1. 所有的django命令
            1. 安装
                pip install django==1.11.14
                pip install -i 源 django==1.11.14
            2. 创建项目
                django-admin startproject 项目名称
            3. 启动项目
                python manage.py runserver      127.0.0.1:8000
                python manage.py runserver 80   127.0.0.1:80
                python manage.py runserver 0.0.0.0:80   0.0.0.0:80
            4. 创建APP
                python manage.py startapp app01
            5. 数据库迁移
                Python manage.py makemigrations    # 将models的变化记录下来 
                python manage.py migrate            # 将变更更新到数据库当中
            
        2. 配置
            1. 静态文件
                STIATIC_URL = '/static/'     # 别名
                STIATICFILES_DIRS = [
                    os.path.join(BASE_DIR,'static'),
                ]
            2. 注释csrf中间件   
            3. TEMPLATES  DIRS  os.path.join(BASE_DIR,'teamplates')
            4. DATABASES    
            5. INSTALLED_APPS =[
                'app01'   或者 'app01.apps.App01Config' 
             ]
        3. ORM类和数据库对应关系
                类   ——》 数据表
                对象 ——》 数据行
                属性 ——》 字段
        4. django使用mysql数据的流程
            1. 创建mysql的数据库
            2. 配置
                ENGINE: mysql
                NAME: 数据库名字
                HOST: ip地址
                PORT:3306
                USER: 用户名
                PASSWORD: 密码
            3. 告诉django使用pymysql模块连接你的mysql数据库
                在与项目同名文件夹下的__init__.py文件写:
                    import pymysql
                    pymysql.install_as_MySQLdb()
            4. 在app01下的models.py中写类(必须继承models.Model):
                class Publisher(models.Model):
                    id = models.AutoField(primary_key=True)
                    name = models.CharField(max_length=32, null=False, unique=True)
                    addr = models.CharField(max_length=128, null=False)
    
                    def __str__(self):
                        return "< Publisher object: {}>".format(self.name)
    
    
                class Book(models.Model):
                    id = models.AutoField(primary_key=True)
                    title = models.CharField(max_length=32, null=False, unique=True)
                    publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE)
    
                    def __str__(self):
                        return "< Publisher object: {}>".format(self.title)
    
    
                class Author(models.Model):
                    id = models.AutoField(primary_key=True)
                    name = models.CharField(max_length=32, null=False, unique=True)
                    books = models.ManyToManyField(to='Book')    
                    
            5. 执行数据库迁移的命令
                Python manage.py makemigrations
                python manage.py migrate
        5.ORM操作
            1. 查
                models.Publisher.objects.all()        # 查询所有的出版社对象的集合
                models.Publisher.objects.get(id=1,nam='sss)   # 查询指定的满足条件的对象     ——》一个对象 
                models.Publisher.objects.filter(id=1,name='sss')  # 查询满足条件的所有对象      ——》 对象列表
                models.Publisher.objects.all().order_by('id')    # 排序
                
                属性:
                    无外键、多对多:
                        pub_obj.id 
                        pub_obj.name
                    外键:
                        book_obj.id
                        book_obj.name
                        book_obj.publisher   ——》book所关联的出版社对象
                        book_obj.publisher.id 
                        book_obj.publisher_id
                    多对多:
                        author_obj.id
                        author_obj.name
                        author_obj.books        ——》django封装的管理对象
                        author_obj.books.all()    ——》 拿到作者管理的所有书籍的对象列表
            2. 增
                models.Publisher.objects.create(name='新的出版社')
                外键:
                    models.Bookj.objects.create(name='新的书名',publisher_id=1)
                    models.Bookj.objects.create(name='新的书名',publisher=pub_obj)
                多对多:
                    autho_obj = models.Author.objects.create(name='新的作者')
                    autho_obj.books.set([1,2])
                    
            3. 删
                models.Publisher.objects.get(id=1).delele()      
                models.Publisher.objects.filter(name='xxx').delele()
            4. 改
                pub_obj.name = '新的名字'
                pub_obj.save() 
                
                外键:
                    book_obj.name = '新的书名'
                    book_obj.publisher = pub_obj
                    # book_obj.publisher_id = pub_obj.id 
                    book_obj.save()
                    
                多对多:
                    author_obj.name='新的作者名'
                    author_obj.save()
                    author_obj.books.set([1,2,3])
                    
            
            
        6. request    ——》 封装了请求所有的内容
            request.method   ——》请求方式 GET POST 
            request.GET      ——》 URL上面传参数 127.0.0.1:8000/del_book/?id=1&name='xx'
                            字典形式     request.GET['id']    request.GET.get('id')
            request.POST     ——》POST请求提交的数据 字典
                        request.POST['id']    request.POST.get('id')    
                        
        7. 函数的返回值         ——》必须是HttpResponse对象
            HttpResponse('字符串')        ——》页面显示字符串的内容
            render(request,'HTML文件名',{k1:v1,})    ——》将字典的内容交给模板渲染成HTML 返回给浏览器
            redirect('/index/')        跳转 重定向 ——》返回一个响应头 Location:/index/
        
        
            
    1.今日内容:
        1. django的模板:
            1. 已经学的内容:
                {{ 变量 }} 
                for 循环
                {% for name in name_list %}
                    {{ name }}
                    {{ forloop.counter }}
                    {{ forloop.last }}
                {% endfor %}
                
                if判断
                {% if 10>5 %}
                    操作
                {% endif %}
                
                {% if 10>5 %}
                    操作
                {% else %}
                    条件不成立的操作
                {% endif %}
                
                
                {% if 10>5 %}
                    操作
                {% elif 10>5 %}
                    elif成立时的操作
                {% else %}
                    条件不成立的操作
                {% endif %}
            2. 今天新的内容
                1. 变量及(.)的使用
                2. filters
                3. 自定义filter
            
            
            
            
            
    上周内容回顾

    二、今日内容总结

    1.变量和(.)的使用:

      1) Django模板中两种特殊符号:

          {{}} 和{%%}  # 变量和标签

         2) 变量

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

         3) 点(.)

          用来获取对象的相应属性值。

          li.0   #取列表中的值

          dic.key   #取字典中的key对象的value

          obj.name   #取对象的属性值

           li.0.name

          obj.read  #取对象的方法,只能调用不带参数或参数有默认值的方法

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

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

     

    2.filters

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

      语法:{{value|filter_name:参数}} 

        ‘|’左右没有空格  

        1)、default (不管有没有定义)

          {{value|default:‘nothing’}}

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

          TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。 # 这个是指没有定义的,会优先于default执行,但是对于那些已定义的但是值为'',[],{}....会显示default或为空。 

           

    <p>{{ add|add:'20'|default:'你错了!' }}</p>
    <p>{{ djsdjfjds|default:'没有值' }}</p>
    <p>{{ string|default:'值为空' }}</p>
    
    40
    
    没定义
    
    值为空
    View Code

        2)、filesizeformat

          {{ value|filesizeformat }}

        3)、 add 给变量加参数

          {{value|add:'2'}}

          a.value值和add参数均为字符串形式,如都为整数则相加,如有一个不为整数则字符串拼接

          b.value值和add参数一个字符串,一个整数,value形式为整数或浮点型都能正常加运算,add参数不为整数则报错

          c.都为整数形式则运算值取整后进行加运算,非四舍五入

         4)、lower,upper、title

         5)、ljust、rjust、center   #

            {{value|ljust:'20'}}

            {{value|center:'20'}}

        6)、length

        7)、slice

          {{value|slice:'1:10:2'}}

           8)、first 、last、join、truncatechars

         {{value|first}}

         {{value|join:'++'}}

         {{value|truncatechars:9}} 

        9)、 date

         日期格式化     

          {{ value|date:"Y-m-d H:i:s"}}
          
        默认格式化设置:

          

           引用方式变为:

          <p>{{ date_test|date}}</p>

        

          10)、safe 

          {{ value|safe}}

          过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

        

    3.自定义filter

        1)定义五步

           

         2)引用两步

             

          3) 自定义过滤器取别名

            

         4) 注意两个名字不能改:

          

        

    记下来,省得每次google
    
    过滤器,变量的显示形式的改变
    
    一、形式:小写
    
    {{ name | lower }}
    
     
    
    二、串联:先转义文本到HTML,再转换每行到 <p> 标签
    
    {{ my_text|escape|linebreaks }}
    
     
    
    三、过滤器的参数
    
    显示前30个字
    {{ bio | truncatewords:"30" }}
    
    格式化
    {{ pub_date | date:"F j, Y" }}
    
     
    
    过滤器列表
    
    {{ 123|add:"5" }} 给value加上一个数值
    
    {{ "AB'CD"|addslashes }} 单引号加上转义号,一般用于输出到javascript中
    
    {{ "abcd"|capfirst }} 第一个字母大写
    
    {{ "abcd"|center:"50" }} 输出指定长度的字符串,并把值对中
    
    {{ "123spam456spam789"|cut:"spam" }} 查找删除指定字符串
    {{ value|date:"F j, Y" }} 格式化日期
    
    {{ value|default:"(N/A)" }} 值不存在,使用指定值
    
    {{ value|default_if_none:"(N/A)" }} 值是None,使用指定值
    
    {{ 列表变量|dictsort:"数字" }} 排序从小到大
    
    {{ 列表变量|dictsortreversed:"数字" }} 排序从大到小
    
    {% if 92|divisibleby:"2" %} 判断是否整除指定数字
    
    {{ string|escape }} 转换为html实体
    
    {{ 21984124|filesizeformat }} 以1024为基数,计算最大值,保留1位小数,增加可读性
    
    {{ list|first }} 返回列表第一个元素
    
    {{ "ik23hr&jqwh"|fix_ampersands }} &转为&amp;
    
    {{ 13.414121241|floatformat }} 保留1位小数,可为负数,几种形式
    
    {{ 13.414121241|floatformat:"2" }} 保留2位小数
    
    {{ 23456 |get_digit:"1" }} 从个位数开始截取指定位置的1个数字
    
    {{ list|join:", " }} 用指定分隔符连接列表
    
    {{ list|length }} 返回列表个数
    
    {% if 列表|length_is:"3" %} 列表个数是否指定数值
    
    {{ "ABCD"|linebreaks }} 用新行用<p> 、 <br /> 标记包裹
    
    {{ "ABCD"|linebreaksbr }} 用新行用<br /> 标记包裹
    
    {{ 变量|linenumbers }} 为变量中每一行加上行号
    
    {{ "abcd"|ljust:"50" }} 把字符串在指定宽度中对左,其它用空格填充
    
    {{ "ABCD"|lower }} 小写
    
    {% for i in "1abc1"|make_list %}ABCDE,{% endfor %} 把字符串或数字的字符个数作为一个列表
    
    {{ "abcdefghijklmnopqrstuvwxyz"|phone2numeric }} 把字符转为可以对应的数字??
    
    {{ 列表或数字|pluralize }} 单词的复数形式,如列表字符串个数大于1,返回s,否则返回空串
    
    {{ 列表或数字|pluralize:"es" }} 指定es
    
    {{ 列表或数字|pluralize:"y,ies" }} 指定ies替换为y
    
    {{ object|pprint }} 显示一个对象的值
    
    {{ 列表|random }} 返回列表的随机一项
    
    {{ string|removetags:"br p div" }} 删除字符串中指定html标记
    
    {{ string|rjust:"50" }} 把字符串在指定宽度中对右,其它用空格填充
    
    {{ 列表|slice:":2" }} 切片
    
    {{ string|slugify }} 字符串中留下减号和下划线,其它符号删除,空格用减号替换
    
    {{ 3|stringformat:"02i" }} 字符串格式,使用Python的字符串格式语法
    
    {{ "E<A>A</A>B<C>C</C>D"|striptags }} 剥去[X]HTML语法标记
    
    {{ 时间变量|time:"P" }} 日期的时间部分格式
    
    {{ datetime|timesince }} 给定日期到现在过去了多少时间
    {{ datetime|timesince:"other_datetime" }} 两日期间过去了多少时间
    
    {{ datetime|timeuntil }} 给定日期到现在过去了多少时间,与上面的区别在于2日期的前后位置。
    
    {{ datetime|timeuntil:"other_datetime" }} 两日期间过去了多少时间
    {{ "abdsadf"|title }} 首字母大写
    
    {{ "A B C D E F"|truncatewords:"3" }} 截取指定个数的单词
    
    {{ "<a>1<a>1<a>1</a></a></a>22<a>1</a>"|truncatewords_html:"2" }} 截取指定个数的html标记,并补完整
    
    <ul>{{ list|unordered_list }}</ul> 多重嵌套列表展现为html的无序列表
    {{ string|upper }} 全部大写
    
    <a href="{{ link|urlencode }}">linkage</a> url编码
    
    {{ string|urlize }} 将URLs由纯文本变为可点击的链接。(没有实验成功)
    {{ string|urlizetrunc:"30" }} 同上,多个截取字符数。(同样没有实验成功)
    
    {{ "B C D E F"|wordcount }} 单词数
    
    {{ "a b c d e f g h i j k"|wordwrap:"5" }} 每指定数量的字符就插入回车符
    {{ boolean|yesno:"Yes,No,Perhaps" }} 对三种值的返回字符串,对应是 非空,空,None
    Django模板系统——过滤器
  • 相关阅读:
    网络基本功(一)细说网络传输
    关于指针的理解
    百度地图定位,标注以及地图中心点问题
    ios 将彩色照片转化成黑白等几种类型
    在 iOS 应用中直接跳转到 AppStore 的方法
    ios中判断当前手机的网络状态
    NTFS 读写高手进阶 Windows 格式硬盘 Mac存文件 开启 ...(转载)
    tableviewcell 中使用autolayout自适应高度
    ios 3D Touch功能的实现
    一些牛人分享的ios技巧,保留着
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/9390557.html
Copyright © 2011-2022 走看看