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{
            width: 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返回值,会拼上传参的路径 -->
    {% 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()

猜你喜欢

转载自www.cnblogs.com/xvchengqi/p/9948320.html