安装虚拟环境
pip install virtualenv
pip install virtualenvwrapper-win -i http://pypi.douban.com/
创建一个文件夹用来存储虚里环境
设置环境变量
系统环境变量 WORKON_HOME
变量值 G:\data 刚刚创建的文件位置
1.创建虚拟环境
mkvirtualenv pyvip pyvip是环境名
2,显示所有虚拟环境
workon
3进入指定的环境
workon 环境名
4,退出环境
deactivate
-i https://pypi.douban.com/simple
django-admin startproject 项目名 创建项目
------------------------------------------------------
manage.py 项目管理器:与项目进行交互的命令工具集的入口
urls.py url配置文件 :django项目中所有地址需要我们取配置
settings.py 项目的总配置文件;里面包含了数据库,web应用,时间等
runserver 配置文件
runserver 127.0.0.1:8080
然后把环境给配置好
设置 --Python Interpreter
---------------------------------------------------------------
在终端terminal中创建一个表床创建不了就返回上一层看看
python manage.py migrate
127.0.0.1:8000/admin 登录
终端启动 python manage.py runserver
----------------------------------------------------------
创建子应用
python manage.py startapp 名字1
添加子应用
'users.apps.UsersConfig' 需要在apps里找
把文件设置为根目录
#语言
LANGUAGE_CODE = 'en-us' 'zh-hans'
#时区
TIME_ZONE = 'UTC' 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
------------------------------------------------------------
DEBUG=True
调试模式,创建工程后初始值为True,即默认工作在调试模式下。
作用:
修改代码文件,程序自动重启
Django程序出现异常时,向前端显示详细的错误追踪信息
而非调试模式下,仅返回Server Error(500)
---------------------------------------------------------------
配置静态文件
1.项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中
STATICFILES DIRS存放查找静态文件的目录
STATIC URL访问静态文件的URL前缀
STATICFILES DIRS=[
BASE DIR/'static'
]
---------------------------------------------------------------
第一步:创建好jango django-admin startproject 项目名
第二步:设置runserver
第三步:把解释器环境配置好
第4步:创建子应用 python manage.py startapp 名字1
第5步:注册子应用
INSTALLED_APPS---'app1.apps.App1Config',
第6步:导入os sys后添加一个查找路径
sys.path.insert(0,os.path.join(BASE_DIR,'apps')) apps是装app的文件夹
第7步:设置settings中的数据库;
'default': {
'ENGINE': 'django.db.backends.mysql', 使用的什么引擎
'NAME': 'xiaoqi' 关联到那个数据库的名称
'USER':'root' 登录数据库的用户名
'PASSWORD':'qwe123' 登录密码
'HOST':'192.168.182.5' 登录的ip地址
'PORT':'3306' 数据库服务器的端口号默认3306
},
第8步:设置settings中的静态文件
#静态文件路径
STATIC_URL = '/static/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'apps','app1','static')
]
#指定存储的绝对路径
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
#指定存储的文件夹
MEDIA_URL='/media/'
#静态文件的目录
第9步:设置setting中的html页面,os.path.join(BASE_DIR,'apps','app1','templates')
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'apps','app1','templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
==============================================
views中写函数
def music(request):
#实现查询功能 所有的信息
if request.method=='GET':
return render(request,'index.html',{'musics':musics_list})
#post请求实现筛选
elif request.method=='POST':
#1,获取输入的查询条件
input_str=request.POST.get('txtquery')
#2,导入网址
return render(request, 'index.html', {'musics': musics_list1,'input_str':input_str})
-----------------------------
urls中设置路由
导入from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.music), #首页的url
path('tv',views.index),
]
=========================================================
mor模型
1,先配置
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
'default': {
'ENGINE': 'django.db.backends.mysql', #mysql引擎
'HOST':'127.0.0.1', #本地IP
'PORT':'3306', #端口号
'USER':'root', #用户名
'PASSWORD':'root', #密码
'NAME':'book', #数据库名
}
}
2,在工程文件的init中
#加载mysql模块
import pymysql
pymysql.install_as_MySQLdb() #自动加载mysql的模
2,在models中写
#当前models中的类就是关联到数据库的表!!!
class gong_dan(models.Model):
#学号 字符类型 主键
sno=models.CharField(max_length=100,primary_key=True)
#姓名 字符类 不为恐慌
sname=models.CharField(max_length=100,null=False)
#出生日期 日期类型
birthday=models.DateField()
#打应出来好看
def __str__(self):
return "学号:%s\t 姓名%s" %(self.sno,self.sname
在命令行执行python manage.py makemigrations
python manage.py migrate
生成数据库表命名规则是app_类名
3,
___________________________________________________________________________________________
1) 数据库表名
模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。
可通过db_table指明数据库表名。
2) 关于主键
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后diango不会再创建自动增长的
主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primarykey。
3)属性命名限制
·不能使用pythonmysql保留关键字。
。不允许使用连续的下划线,这是由django的查询方式决定的。
·定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=mode1s.字段类型(选项)
4) 字段类型
和MvSOL的类型类似的
AutoField >>>>自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField>>>>>布尔字段,值为True或False
NullBooleanField>>>>>支持Null、True、False三种值
CharField>>>>>>字符串,参数maxlength表示最大字符个数,必须设置
TextField>>>>>大文本字段,一般超过4000个字符时使用
IntegerField>>>>>整数
DecimalField>>>>>十进制浮点数,参数max_digits表示总位数,参数decimalplaces表示小数位数
FloatField>>>浮点数
DateField>>>>日期,参数autonow表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改的时间戳,它总是使用当前日期,默认为False;参数auto nowadd表示当对象第一次被创建时自动设置当前时间,用干创建的时间戳,它总是使用当前日期,默认为False:参数auto nowadd和auto now是相互排斥的,组合将会发生错误
TimeField>>>>时间,参数同DateField
DateTimeField>>>>日期时间,参数同DateField
FileField>>>>上传文件字段
ImageField>>>>>继承于FileField对上传的内容进行校验,确保是有效的图片
5) 选项
选项 说明
null 如果为True,表示允许为空,默认值是False
blank 如果为True,则该字段允许为空白,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若值为True,则在表中会为此字段创建索引,默认值是False
default 默认
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique 如果为True,这个字段在表中必须有唯一值,默认值是False
verbose_name 主要是admin台显示
null数据库范畴的概念,blank表单验证范畴的
6) 外键
在设置外键时,需要通过ondelete选项指明主表删除数据时,对于外键引用表数据如何处理,在djangodbmodels中包含了可选常量:
·CASCADE级联,删除主表数据时连通一起删除外键表中数据
·PROTECT保护,通过抛出ProtectedError异常,来阴止删除主表中被外键应用的数据
SET NULL设置为NULL,仅在该字段null=True允许为null时可用
·SET DEFAULT设置为默认值,仅在该字段设置了默认值时可用
·SETO)设置为特定值或者调用特定方法
·DONOTHING做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError常
----------------------
运行这个代码进去环境测试 python manage.py shell
导入 from users.models import BookInfo
导入 from users.models import BookInfo,PeopleInfo
orm增加
方法1
直接传数据了 book = BookInfo(name='python',pub_date='2023-3-31')
把插入的数据保存到数据库中 book. save()
方法2
模型类名 属性名
BookInfo.objects.create(name='hello',pub date='2023-4-1')
orm 修改
方法1
先查询
变量 模型类
book =BookInfo.objects.get(name='python')
在查看这个变量确定有了
book
book.name='java' 修改
book. save() 保存
方法2
filteri 返回的是一个查询集 K{ 'hello'} >
get 当前的数据 'hello'
BookInfo.objects.filter(name='hello').update(name='world')
orm 删除
方法1
book = BookInfo.objects.get(name='world')
book.delete()
方法2
BookInfo.objects.filter(name='java').delete()
orm 查询
get 查询单一的对象,如果不存在会报错.DoesNotEx
all 查询多个结果具查询出所有的结果返回列表可以在后面切片[1:2]
count 查询结果数量
filter() 过滤出多个结果
exclude(() 排除 符合条件的结果
模型类 查所有
BookInfo.objects.all()
模型类 查有多少条数据
BookInfo.objects.count()
过滤查询
属性名双下滑线比较运算符=值
BookInfo.objects.filter(id__exact=1)
模糊查询 contains startswith endswith
BookInfo.objects.filter(name__contains='传') 在中间的值
BookInfo.objects.filter(name__startswith='天') 在开头的值
BookInfo.objects.filter(name__endswith='部') 在后面的值
空查询
BookInfo.objects.filter(name__isnull=True)
False 不为空 返回不为空的全部数据
True 为空 返回空的数据
范围查询
模型类 属性名 范围索引为135的值
BookInfo.objects.filter(id__in=[1,3,5])
in 是不是存在
gt 大于 greater then
gte 大于等于 greater then equal
lt 小于
lte 小于等于
exclude 不等
id不等于3的所有结果
BookInfo.objects.exclude(id=3)
日期查询
年 月 日
year month day
属性名__年
BookInfo.objects.filter(pub_date__year=1980)
使用时先导入 from django.db.models import F,Q
F对象 用在算数方面
Q对象 and or not
阅读量 大于2倍的评论量的图书
BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
or 与
BookInfo.objects.filter(Q(readcount__gt=20)|(id__lt=3))
not非 ~
BookInfo.objects.filter(~Q(readcount__gt=20))
and 或
BookInfo.objects.filter(Q(readcount__gt=20)& Q(id__lt=3))
关联查询
多表查询:values()查询出来的数据是字典序列QuerySet:
values_list()
values()拿到所有的值
book = BookInfo.objects.all(().values() all 取init里定义的值哦
book
[{'id':1,'name': '射雕英雄传','pub date': datetime.date(1980
unt': 12, 'commentcount': 34, 'is_delete': False}, {'id': 2, 'name':'天龙
e': datetime.date(1986,7,24)]
ret =PeopleInfo.objects.all().values('name') 取所有的值还是字典
ret
[{'name':'郭靖'},{'name':'黄蓉'},{'name':'黄药师
海超风'},{'name': '乔峰'},{'name':'段誉'},{'name':
:'令狐冲'},{'name':'任盈盈'},{'name':'岳不群'},]
ret =PeopleInfo.objects.all().values('name').first() 取第一个值
ret {'name':'郭靖'}
ret =PeopleInfo.objects.all().values( name', description').last() 取最后一个值
ret {'name':'岳不群','description':'18'}
外键给了数据 自己定义的一个
ret =PeopleInfo.objects.filter(book_id=1).values('book__name')
ret
[{'book__name':'射雕英雄传'},{'book__name':
'射雕英雄传'},{'book__name':
雕英雄传'},{'book_name':'射雕英雄传'},{'book__name'
射雕英雄传'}]
values_list
ret =PeopleInfo.objects.values_list('book__ name')
ret
[('射雕英雄传'),('射雕英雄传’),('射雕英雄传'),('射雕英雄传')
天龙八部',),('天龙八部'),('天龙八部',),('天龙八部',),('笑傲江湖?
'笑傲江湖'.),('笑傲江湖’).('雪山飞狐’),('雪山飞狐’,),('雪山飞”)]
聚合函数: 求和 平均 最大 最小
from django.db.models import Sum ,Avg, Max,Min 先导入
类 方法 求和 属性名
BookInfo.objects.aggregate(Sum('readcount'))
{'readcount__sum': 126}
排序
类名 排序 默认升加个-降序
BookInfo.objects.all().order_by('readcount') 升序
BookInfo.objects.all().order_by('-readcount') 降序
一对多的查询语句:
一对应的模型类对象.多对应的模型类名小写 _set : book.peopleinfo_set.all()
book = BookInfo.objects.get(id=1) 先给实例化一个命=名字
book
book.peopleinfo_set.all() 在用这给取对应另外一个表的值
[
由多的到一的访问查询语法:
多对应的模型类对象,多对应的模型类中外键属性名
person =PeopleInfo.objects.get(id=1)
person
person.book
分页方法
先导入 :from django.core.paginator import Paginator
准备要分页的数据
book = BookInfo.objects.all(()
使用分页器 ---- 对数据指定分页的页码
paginator = Paginator(book,2)
page_skus = paginator.page(1)
>>> page_skus
================================
json_str={'a':'name'} 前端传回来的是字符串要解析成字典
json_dict=json.loads(json_str,encodings='utf-8')
num1=request.GET.get('num1') 取前端的值
num1=request.GET.getlist('num1') 取前端的对多个值
from django.http import JsonResponse,HttpResponse 导入
return JsonResponse(字典类型) 输出json的数据类型
return JsonResponse(非字典类型,safe=False) 需要设置一下
---------------------------------------------------------------
from django.shortcuts import reverse,redirect 导入后
#重定项
def index2(request):
#当访问index2后跳转到index里
return redirect(reverse('index'))
=========================================
GET 和 POST区别
1.都是请求方法 get把参数放到URL中,POST通过request POST,body 传递参数
2.缓存(浏览器)get请求 浏览器会记录 post的请求时不会被缓存的
3.底层----http超文本的传输协议 都是基于此 底层都是tcp/ip
4.限制:get数据显示在url 长度限制 大小限制 post没有限制
5.get和post 那个快。传输的数度差不多
6.都会把数据先发送到浏览器上,get--http--header请求头 data,服务器返回200
post 不一样先给浏览器发送header,服务器响应100,浏览器在发生data 服务器在响应200(返回数据),网络好的是时候一次和两次时间没差,网络差的时候两次包,验证数据包的完整性,保证数据完整,
7.
=====================================
上传图片:
#指定存储的绝对路径
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
#指定存储的文件夹
MEDIA_URL='/media/'
创键这个文件夹
from django.conf import settings
#上传文件
def gat_ing(request):
if request.method=='POST':
img=request.FILES.get('前端name定义的值').name
imgs='%s\%s'%(settings.MEDIA_ROOT,img)
with open(imgs,'wb') as f:
for imgs in img.read():
f.write(imgs)
return HttpResponse('上传成功')
return render(render('html'))
===================================================
模板的语法: {{ }}
模板中的过滤器:语法:{{变量名|过滤器:可选参数}}
#传值的模板语法
#前端接受方式{{ 前端接受的名字 }} {{ 前端接受的名字1 }} {{ 前端接受的名字2 }}
#直接取的list{{ 前端接受的名字1[1] }} dict{{ 前端接受的名字2.键1 }}
def moban(request):
name1='字符串'
list1=['字符串','字符串1']
dice1={'键1':'值1','键2':'值2'}
return render(request,{'前端接受的名字':name1,'前端接受的名字1':list1,'前端接受的名字2':dice1})