zoukankan      html  css  js  c++  java
  • DAY76-Django框架(七)

    一、模板的导入

    当你写了一段html样式,你之后还会用到这个组件,那么为了减少重复代码,你可以把这一段单独建立成一个模板,然后可以不断地复用它。这就叫模板的导入

    语法:

    {% include '模板名' %}
    

    模板mod.html

    <div class="panel panel-danger">
      <div class="panel-body">
        Panel content
      </div>
      <div class="panel-footer">Panel footer</div>
    </div>
    

    模板的导入

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    </head>
    <body>
    {% include 'mod.html' %}
    </body>
    </html>
    

    二、模板的继承

    对于网站来说,很多的页面的布局其实是一样的,不同的是里面的内容,对于这个问题Django使用了模板的继承来解决这个问题。

    1.建立一个父模板,然后再父模板里留出供子模板使用的区域(盒子)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
        <style>
            .top{
                height: 100px;
                background-color: cyan;
            }
            .left{
                 200px;
                height: 500px;
                background-color: #c8e5bc;
            }
            .middle {
                margin-top: -500px;
                margin-left: 300px;
            }
        </style>
    </head>
    <body>
    <div class="top"></div>
    <div class=""></div>
    <div class="left col-md-3"></div>
    <div class="middle">
        {% block middle %}
            <h1>父模板的内容</h1>
        {% endblock %}
        {% block middle1 %}
            <h1>父模板的内容</h1>
        {% endblock %}
        {% block middle2 %}
            <h1>父模板的内容</h1>
        {% endblock %}
    </div>
    </body>
    </html>
    

    2.在子模板使用

    #指定继承的模板
    {% extends 'base.html %}
    #指定填写的盒子
    {% block middle %}   
        <h1>子模板的内容</h1>  
    {% endblock %} 
     
    #可以填写多个盒子
    {% block middle1 %}
        <h1>子模板的内容1</h1>
    {% endblock %}
    {% block middle2 %}
        <h1>子模板的内容2</h1>
    {% endblock %}
     
     #注:
     #1.不能对同一个盒子使用多次
     
     #2.子模板中没有使用盒子,那么以父模板为基础
     
     #3.子模板中使用了盒子但是没有内容,那么不会以父模板为基础,就是空白。相当于重写了父类方法,但是没有任何操作。
    

    三、静态文件相关

    一般对静态文件的操作是在在setting里配置好后

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,'static')
    ]
    

    在HTML里使用

    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    

    但是这样对静态文件的路径就容易写死了,一旦setting里的配置改动,那么所有的路径都要一个一个去修改。

    为了方便修改,我们可以使用static标签函数

    <!DOCTYPE html>
    <html lang="en">
    <head>
    
        <meta charset="UTF-8">
        <title>Title</title>
        <--! <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> -->
        {% load static %}
        <!-- 方法一 -->
        <!-- static返回值,会拼上传参的路径 -->
        <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
        
        
        <!-- 方法二 -->
        <!-- get_static_prefix返回值是:静态文件的地址,相当于/static/ -->
        <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
    </head>
    

    四、单表操作

    1.数据迁移命令

    python3 manage.py makemigrations   #只是对变化做一个记录,记录文件在app的migrations
    python3 manage.py migrate   #把更改提交到数据库
    python3 manage.py showmigrations  #查看那个没有提交到数据库
    

    2.数据操作

    1.添加数据

    #方式一:返回结果是一个对象
    book=models.Book.objects.create(name='红楼梦',price=23.8,publish='人民出版社',author='曹雪芹',create_data='2018-09-17')
    #方式二:先实例化产生对象,然后调用save方法,保存 
    book=models.Book(name='水浒传',price=99.8,publish='老男孩出版社',author='施耐庵',create_data='2018-08-08')
    book.save()
    

    2.修改数据

    #方式一:
    book = models.Book.objects.filter(name='红楼梦').update(price=99.99)
    #方式二:
    book = models.Book.objects.filter(name='水浒传').first()
    book.price=66
    book.save()
    print(book)
    

    3.删除数据

    #方式一:
    book = models.Book.objects.filter(name='红楼梦').delete()
    #方式二:
    book = models.Book.objects.filter(name='红楼梦').first()
    book.delete()
    print(book)
    

    4.查询数据

    查询API

    #1.all():查询所有,返回QuerySet对象
    book = models.Book.objects.all()
    
    #2.filter():查询符合条件的,可以传多个参数,用逗号分隔,他们之间是and的关系,返回QuerySet对象
    book = models.Book.objects.filter(name='红楼梦')
    
    #3.get():查询符合条件的,返回结果有且只有一个,超过或者没有都会抛出错误。返回objects对象
    book = models.Book.objects.get(name='红楼梦')
    
    #4.exclude():它包含了与所给筛选条件不匹配的对象。返回QuerySet对象
    book = models.Book.objects.exclude(name='红楼梦')
        
    #5.order_by():对查询结果排序,默认是ASC升序,加上-就是降序。返回QuerySet对象
    #如果直接order_by,相当于执行了all()
    book = models.Book.objects.order_by()
    
    #对名字等于红楼梦的记录的价格升序排序
    book = models.Book.objects.filter(name='红楼梦').order_by('price') | order_by('-price')#降序
    
    #6.reverse():对查询结果反向排序,升序变降序,降序变升序。返回QuerySet对象
    book = models.Book.objects.filter(name='红楼梦').order_by('price').reverse()
      
    #7.count():返回数据库中匹配查询(QuerySet)的对象数量。
    book = models.Book.objects.all().count()
      
    #8.first():返回第一条记录,返回objects对象
    book = models.Book.objects.all().first()
    
    #9.last():返回最后一条记录,返回objects对象
    book = models.Book.objects.all().last()
        
    #10.exists(): 如果QuerySet包含数据,就返回True,否则返回False
    book = models.Book.objects.filter(name='三国演义').exists()
        
    #11.values():返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列,queryset对象里套字典,可以指定出现的字段。不带参数相当于all()。返回objects对象
    book = models.Book.objects.values('name','price')
    
    #12.values_list():   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列。不带参数相当于all()。返回objects对象
    book = models.Book.objects.values_list('name','price')
     
    #13.distinct():从返回结果中剔除重复纪录,必须完全一样,才能去重。返回objects对象
    book = models.Book.objects.values_list('name').distinct()
    
    
    '''
    #注:关于queryset对象和Objects对象的区别
    1. queryset是查询集,就是传到服务器上的url里面的内容。Django会对查询返回的结果集QerySet进行缓存,这里是为了提高查询效率。
    
        也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才回去数据库查询。
    
    2. Objects是django实现的mvc框架中的数据层(model)m,django中的模型类都有一个objects对象,它是一个django中定义的QuerySet类型的对象,
    
        它包含了模型对象的实例。简单的说,objects是单个对象,queryset是许多对象。
    '''
    

    基于双下划线的模糊查询

    #1.__gt:大于
    book = models.Book.objects.filter(price__gt='90')
    
    #2.__lt:小于
    book = models.Book.objects.filter(price__lt='90')
    
    #3.__gte:大于等于
    book = models.Book.objects.filter(price__gte='90')
    
    #4.__lte:小于等于
    book = models.Book.objects.filter(price__lte='90')
    
    #5.__in:在其中
    book = models.Book.objects.filter(price__in=['66','90','73.8'])
    
    #6.__range:在范围里
    book = models.Book.objects.filter(price__range=[80,100])
    
    #7.__contains:模糊查询%...%
    book = models.Book.objects.filter(name__contains='红')
    
    #8.__icontains:忽略大小写的模糊查询
    book = models.Book.objects.filter(name__icontains='p')
    
    #9.__startswith:以....开头
    book = models.Book.objects.filter(name__startswith='红')
    
    #10.__endswith:以....结尾
    book = models.Book.objects.filter(name__startswith='传')
    
    #11.__year:年份
    book = models.Book.objects.filter(date__year='2018')
    

    五、在Django以脚本文件来运行

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day76.settings")
      	import django
        django.setup()
    
  • 相关阅读:
    Cookie数据的编码及解码
    删除单链表节点,时间复杂度为O(1)
    匹配URL
    C#文本框允许使用ctrl+A
    实现统计一个字符串所含的不同字符的总数
    调用win32 api 函数SendMessage() 实现消息直接调用
    关于C++的const对象
    从一个文本文件中找出使用频率最高的五个字符
    C++基础中的基础(深拷贝与浅拷贝)
    python+Django CRM客户关系管理系统开发(十)--左右移动选择框功能开发
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9948320.html
Copyright © 2011-2022 走看看