一、模板的导入
当你写了一段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()