django框架
1、django中的数据库连接
1、连接数据库
打开settings.py中的DATABASES 中设置数据库的链接参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'my_demo',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306'
}
}
2、配置链接插件
在settings.py同级的文件夹内的init.py文件中写入如下代码
import pymysql
pymysql.install_as_MySQLdb()
3、编写models
from django.db import models
# Create your models here.
class User(models.Model):
username=models.CharField(max_length=32,unique=True,primary_key=True)
password=models.CharField(max_length=32)
phone=models.CharField(max_length=11)
email=models.EmailField(max_length=32)
4、数据库的迁移
①迁移是django同步你对象模型所做的更改(添加、删除字段等)到你的数据库中。
②migrations文件是每个应用(app)中数据库迁移后生成的中间文件
③python manage.py makemigrations 生成迁移文件
④python manage.py migrate 执行迁移程序
5、创建admin管理员
1、python manage.py createsuperuser
2、在admin.py中注册我们的模型类
from django.contrib import admin
from website.models import User
# Register your models here.
class AuthorAdmin(admin.ModelAdmin):
admin.site.register(User)
6、实现从数据库中获取数据
def demo(request):
if request.method=="GET": #请求方式为get时,渲染demo.html页面给用户
return render(request,"demo.html") #当用户请求demo/url时,返回demo.html文件
else:
#执行post请求的form表单的提交操作
uname=request.POST.get("uname") #获取用户输入的用户名
upwd=request.POST.get("upwd") #获取用户输入的密码
#从数据库中查询数据,对比密码是否正确,如果正确的话让用户登陆
result=User.objects.filter(username=uname,password=upwd)
if result:
return render(request,"index.html")
else:
return HttpResponse("用户名或密码错误!")
7、用户注册
def my_regist(request): #注册视图
if request.method=="GET":
return render(request,"my_regist.html")
else:
#获取用户注册时输入form表单的数据
uname=request.POST.get("uname") #获取用户输入的用户名
upwd=request.POST.get("upwd") #获取用户输入的密码
phone=request.POST.get("phone") #获取手机信息
email=request.POST.get("email") #获取邮箱信息
#查看用户输入的用户名是否已经存在于数据库
same_user=User.objects.filter(username=uname)
if same_user:
return HttpResponse("用户已经存在!")
else:
#向数据库插入数据
User.objects.create(
username=uname,
password=upwd,
phone=phone,
email=email
)
return HttpResponse("数据插入成功!")
2、创建新的app
1、python manage.py startapp app名称
2、在settings.py里注册app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
'book',
]
3、路由分发
1、在所有的app中创建一个urls.py文件
2、进行主路由文件配置分发
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('user.urls')),
]
3、子路由配置路径
from django.urls import path
from user.views import *
urlpatterns = [
path('login/',login),
path('regist/',regist),
]
4、ORM模型的操作
方法 | 说明 |
---|---|
all() | 查询全部记录,返回QuerySet查询对象 |
get() | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude() | 查询符合条件之外的全部记录 |
1、排序查询
与all方法不同,他会用sql语句的order by子句对查询结果进行根据某个字段选择性的进行排序
默认是按照升序排序,降序排序需要在列前面加-
books=Book.objects.order_by("-release_time")
for book in books:
print(book.release_time)
2、根据条件查询多条记录
当多个属性在一起时为与关系,and
#想查询出版社为清华大学出版社并且作者为张三的书籍的名称
books=Book.objects.filter(publish="清华大学出版社",author="张三")
print(books)
3、查询谓词
https://www.cnblogs.com/maple-shaw/p/7701201.html
4、修改数据
1、修改单个实体的某些字段值的步骤
def change(request): #修改书籍的视图函数
#查询id=5的数据,修改此书籍的价格为88元
book=Book.objects.get(id=5) #查
book.price=88 #改
book.save() #存
return HttpResponse("修改成功!")
2、修改批量数据
#想将id>3的书籍的价格都改为101元
books=Book.objects.filter(id__gt=3)
books.update(price=101)
return HttpResponse("修改成功!")
5、删除数据
删除记录是指删除数据库中的一条或者多条记录
删除单个对象或者删除一个查询结果集中的全部对象都是用delete方法
def delete(request): #删除书籍的函数
#删除id=3的书籍信息
# book=Book.objects.get(id=3)
# book.delete()
#删除id>4的书籍信息
books=Book.objects.filter(id__gt=4)
books.delete()
return HttpResponse("删除成功!")
6、聚合查询
聚合查询是指一个数据表中的一个字段的数据进行部分或全部统计查询
from django.db.model import *
Sum Avg Count Max Min
def juhe(request):
#想计算数据库中所有数据价格的平均数
result=Book.objects.aggregate(my_avg=Avg("price"))
print("书籍的平均价格为:",result["my_avg"])
return HttpResponse("计算成功!")
分组聚合
def juhe(request):
#想计算数据库中所有数据价格的平均数
# result=Book.objects.aggregate(my_avg=Avg("price"))
# print("书籍的平均价格为:",result["my_avg"])
#想查看每个出版社出版了多少本数
pub_set=Book.objects.values("publish") #得到出版社的分组数据
print(pub_set)
#根据出版社查询分组,使用Count聚合函数
pub_count_set=pub_set.annotate(my_count=Count("publish")) #返回查询集合
print(pub_count_set)
return HttpResponse("计算成功!")
7、F对象
一个F对象代表数据库中某条记录的字段信息
作用:
1、通常是对数据库中的字段值在不获取的情况下进行操作
2、用于类属性字段之间的比较
说明:
一个F对象代表了一个model字段的值
F对象通常是对数据库中的字段值在不加载到内存中的情况下直接在数据库服务器端进行操作
F对象用于对数据库中的两个字段的值进行比较
#想查询数据库中出售价格大于定价的书籍的名称 price>make_price
books=Book.objects.filter(price__gt=F("make_pice"))
print(books)
8、Q对象
当在获取查询结果集时,需要使用复杂的逻辑,就可以借助Q对象进行操作
and(&) or(|) not(~)
#想查询出版社是清华大学出版社,或价格大于100的书籍名称
books=Book.objects.filter(Q(publish="清华大学出版社")|Q(price__gt=100))
print(books)
return HttpResponse("修改成功!")
#想查询出版社是清华大学出版社,且价格大于100的书籍名称
books=Book.objects.filter(Q(publish="清华大学出版社")&Q(price__gt=100))
print(books)
return HttpResponse("修改成功!")
5、用户和数据的绑定
实现用户表和电影表的关联
当两个表关联后,用户可以实现上传电影信息的功能,用户也可以修改和删除自己上传的电影信息,每个电影都要与用户进绑定
1、一对多映射
一对多是表示现实事物间存在的一对多的对应关系
当一个A类对象可以关联多个B类对象时,就在B类的模型中建立一个外键
class A(models.Model):
pass
class B(models.Model):
属性=models.Foreignkey("A"的模型类)
在现实开发当中 创建项目数据库架构(表结构)
1、mysql中直接实现 约束器
2、通过python读写数据库去实现
2、一对多关系的ORM操作
def one_more(request):
#想查询用户张三所上传的全部电影的名称
movies=User.objects.get(username="张三")
movie=movies.moviedata_set.all() #通过moviedata_set获取对应的多个电影的数据对象
for i in movie:
print(i.title)
return HttpResponse("ok!")
6、添加登陆页面的跳转功能
1、url的反向解析
from django.urls import path
from user.views import *
urlpatterns = [
path('login/',login,name="login"),
path('regist/',regist,name="regist"),
]
<a href="{% url 'regist' %}">前往注册</a>
7、django模板语言
1、模板的传参
模板传参是指把数据形成字典,传参给模板,为模板渲染提供数据
模板变量的使用:
{{变量名}}
{{变量名.属性}} //用于ORM模型传参
{{变量名.key}}
{{对象.方法}}
{{函数名}}
2、模板的标签
1、作用
将一些服务器的功能嵌入到模板中
{% 标签 %}
{% 结束标签%}
2、if标签的使用
{% if 条件表达式1 %}
...
{% elif 条件表达式2 %}
....
{% else %}
...
{% endif %}
{% if books > 0 %}
<p>book大于0</p>
{% else %}
<p>book不大于0</p>
{% endif %}
</body>
3、for标签使用
{% for 变量 in 可迭代对象%}
...
{% empty %}
....当可迭代对象无数据填充语句时
{% endfor %}
for循环的内置变量
变量 | 描述 |
---|---|
forloop.counter | 循环的当前迭代(从1开始索引) |
forloop.counter0 | 循环的当前迭代(从0开始) |
forloop.revcounter | 循环结束的迭代次数(从1开始索引) |
forloop.revcounter0 | 循环结束的迭代次数(从0始索引) |
forloop.first | 如果这是第一次通过循环则为真 |
forloop.last | 如果真是最后一次循环则为真 |
forloop.parentloop | 当循环嵌套,parentloop表示外层循环 |
8、session机制
1、介绍
1、seesion对象是存在于一个类似于字典的类型的对象,可以用类似于字典的方式进行操作
2、session只能存储能够序列化的数据,入字典列表等
2、存储信息到session
1、当用户登陆成功之后,将用户的名称存储到seesion
request.session["key"]=value
2、从session中获取信息
value=request.session["key"]
3、删除session
del request.session["key"]
9、django使用原有数据进行操作
1、读取已有表的字段数据用于创建django中的models
python manage.py inspectdb
2、将生成的字段导入到models.py
python manage.py inspectdb > movie/models.py
class Meta:
managed = True
db_table = 'movie_datas'
#可以更改数据库
3、同步迁移数据库
python manage.py makemigrations
python manage.py migrate
4、转移表的数据
INSERT INTO movies_data SELECT * FROM movie_data;
10、过滤器
1、作用
在变量输出时对变量的值进行处理
可以通过使用过滤器来改变变量的输出显示
2、语法
{{变量 |过滤器名称:参数值 |过滤器名称:参数值}}
11、模板的继承
1、直接完全继承
{% extends 'index.html' %}
2、需要修改父模板的部分内容
在父模板需要修改的位置添加上如下代码
{% block title %}
<title>信息展示</title>
{% endblock %}
12、分页
分页是指web页面有大量数据需要显示,为了方便阅读,每页中只显示部分数据
django提供了Paginator类可以方便实现分页功能
Paginator
1、对象的构造方法
Paginator(object_list,per_page)
object_list:需要分页数据的对象列表
per_page:每页的数据个数
2、Paginator的属性
count:需要分类数据的对象总数
num_pages:分页后的页面总数
page_range:从1开始的range对象,用于记录当前页码数
3、Paginator的方法
1、has_next():如果有下一页 返回True
2、has_previous():如果有上一页 返回True
3、has_other_pages():如果有上一页或下一页返回True
4、next_page_number():返回下一页的页码,如果下一页不存在则抛出异常
5、previous_page_num():返回上一页的页码,如果上一页不存在则抛出异常
6、len():返回单前页面对象的个数
4、将分页的功能进行封装
def my_page(movies,request): #此函数是封装分页功能的函数
paginator=Paginator(movies,15) #创建分页对象,每页显示15个数据
cur_page=request.GET.get("page","1") #得到当前的默认页
try:
int_cur_page=int(cur_page) #将所有的页码数都变为整型
except:
int_cur_page=1
if paginator.num_pages <= 15:
page_range = range(1, paginator.num_pages + 1)
elif int_cur_page<=6:
page_range=range(1,11) #显示前十页的页码
#如果当前页数+5比最大页数还大,代表此时后面没有页数可以继续增加了
elif int_cur_page+5>paginator.num_pages:
page_range=range(paginator.num_pages-9,paginator.num_pages+1)
else:
page_range=range(int_cur_page-5,int_cur_page+5)
#当页码小于等于6时,固定显示前十页的页码
try:
page=paginator.page(cur_page)
except PageNotAnInteger:
page=paginator.page(1) #如果输入的不是整数,返回第一页
except EmptyPage:
page=paginator.page(paginator.num_pages) #如果输入的页数不存在则返回最后一页
return (page_range,page)
13、文件上传
1、在settings中设置保存上传文件的路径
MEDIA_ROOT=os.path.join(BASE_DIR, "statics/files")
2、需要有一个页面提供上的表单信息
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<br>
<input type="submit" value="上传">
</form>
3、在页面中导入模块
from django.conf import settings
import os
def upload_file(request): #上传简历
if request.method=="POST":
a_file=request.FILES["myfile"]
print("上传的文件名为:",a_file)
filename=os.path.join(settings.MEDIA_ROOT,a_file.name)
with open(filename,"wb") as f:
data=a_file.file.read()
f.write(data)
return HttpResponse("文件上传成功!")
return render(request,"upload_file.html")
14、echarts绘图
使用前需先引入 echarts.js,根据文档传入数据绘制图表
js绘制图表的echarts官网