静态文件配置*******
为什么用户在浏览器中输入的网址能够访问到对应的资源,
前提是后端提前开设该资源的访问,在urls.py文件中进行配置该路由,
如果我的后端没有开设相关的资源,用户是无法访问到的。
1.默认情况下所有的html文件都是放在templates文件夹内 2.什么是静态文件 网站所使用到的提前写好的css js 第三方模块 图片都叫做静态资源 3.默认情况下网站所用到的静态文件资源全部放在static文件夹下。 通常情况下,在static文件夹内部还会再建其他文件夹 css 文件夹 js 文件夹 font 文件夹 img 文件夹 为了更加方便的管理文件 django中,需要手动创建static文件夹 4.静态文件动态绑定----重点!!! {%load static%} <link rel="stylesheet" href="{%static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{%static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script> 5. #访问静态资源文件接口前缀,通常情况下接口前缀的名字是static STATIC_URL = '/xxx/' #例如通过 http://127.0.0.1:8000/xxx/a.txt查找a.txt文件 #手动配置静态文件访问资源 STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static') os.path.join(BASE_DIR,'static1') os.path.join(BASE_DIR,'static2') #多个配置文件,查找顺序,自上向下依次查找,找到就结束 ] 6. form表单默认是get请求 get请求也能够携带参数 http://127.0.0.1:8000/login/?username=jjjjksk & password=123 特点:url?xxx=xxxx & yyyy=yyyy 1.携带的数据不够安全 2.携带的数据大小有限制 ,最大好像应该差不多是4kb左右 3.通常只会携带一些不是很重要的数据 7.post请求会出现403,需要注释settings中下面的中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
8. <form action="" method="">默认处理的是get请求, get请求指向拿到login页面 post请求向后端提交数据,然后后端做校验 9.如何判断当前请求方式??? request.method获取请求的方式 拿到的是字符串大写的请求方式 GET POST print(request.method,type(request.method)) 打印:GET <class 'str'> def login(request): # print('来了,小老弟') # print(request.method,type(request.method)) if request.method=='post': print(request.method) return HttpResponse('昂首挺胸') print(request.method) return render(request,'login.html') ''' 视图函数都必须有返回值, 并且返回值都是HttpResponse对象 ''' 10.request方法初始 request.method 获取请求方式,并且纯大写的字符串 print(request.POST) 获取用户提交的post请求数据 如何获取用户数据********* request.POST.get() #默认只会获取列表最后一个元素 request.POST.getlist() #如果你想获取列表,用getlist()方法 print(request.GET) 获取用户提交的GET请求数据 如何获取用户数据********* request.GET.get() #默认只会获取列 表最后一个元素 request.GET.getlist() #如果你想获取列表,用getlist()方法 11.pycharm连接数据库,如果最右侧没有显示database的话,可以在settings中配置 settings --> Plugins --> Database Tools and SQL(推荐右侧的全部勾选上) 12.django连接MySQL*********** 必须要有两步操作 1.在settings中找到DATABASES,然后把default中的配置修改为对应mysql的信息 需要注意的是default中的key值都需要是全大写。 原始的 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 改后的 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day49', 'USER':'root', 'PASSWORD':'root', 'HOST':'127.0.0.1', 'PORT':3306, 'CHARSET':'utf8' } } 2.主动告诉django 不要用默认的mysqldb连接,而是用pymysql 你可以在项目名下的__init__.py中书写 也可以在应用名下的__init__.py中书写 书写内容是: import pymysql pymysql.install_as_MySQLdb() 13.django orm简介 orm 对象关系映射 类 --- 表 对象 --- 数据 对象.属性 --- 字段对应的值 为什么使用orm? 能够让不会数据库操作的人也能够简单方便去操作数据库 orm的缺点: 封装程度太高,有时候会出现查询效率偏低的问题 所以工作中: 简单的用orm 复杂的追求速度的,需要你手动书写sql语句 14.django中如何操作orm? 书写模型类 去应用下的models.py中书写模型类 注意事项: 之后在写django项目的时候,一个django项目对应一个数据库, 不要出现多个项目使用同一个数据库的情况************* 15.*****************数据库迁移(同步)命令******************************** 1.python manage.py makemigrations 将数据库的修改,记录到migrations文件中 2.python manage.py migrate 将修改操作真正的同步记录到数据库中 注意事项: 1.这两条命令是同步进行的,成双成对,缺一不可 2.只要修改了models里面和数据库相关的代码,你就必须重新执行上面的两条命令 个人建议: 只要你离开了你的电脑,你就顺手锁屏,锁屏快捷键是 Windows+L 锁屏 ************************************************************************* 16.模型表字段的增删改查 class User(models.Model): username = models.CharField(max_length=255) password = models.IntegerField() email = models.EmailField() 注意事项: 字段:email = models.EmailField() 该字段需要设置默认值,或者该字段允许为空,两种方式需要选择一个 方式1 设置默认值 email = models.EmailField(default='123@qq.com') 方式2 设置为空 email = models.EmailField(null=True) 注意:email虽然之前设置了默认值 default='123@qq.com' 后面又修改为 null=True, 但是仍然对之前设置过的email字段没有任何影响的 phone = models.BigIntegerField(null=True) 方式3 直接根据他的提示设置默认值 gender ''' E:\Python jieshiqi\11月份练习考试\day50>python manage.py makemigrations 1) Provide a one-off default now (will be set on all existing ro ws with a null value for this column) 2) Quit, and let me add a default in models.py Select an option: 1 #######此处做出自己的选择,1设置默认值,2退出设置默认值 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now Type 'exit' to exit this prompt >>> 'male' #######此处设置默认值,注意要有引号 Migrations for 'app01': app01\migrations\0005_auto_20191123_2054.py - Add field gender to user - Alter field email on user E:\Python jieshiqi\11月份练习考试\day50>python manage.py migrate ###不要忘记提交数据到数据库 ''' 注意事项,字段的删除谨慎使用,因为对应字段都已经有了数据,删除后不可恢复(如同删库跑路) 删除字段email、phone、gender: # email = models.EmailField(default='123@qq.com') # phone = models.BigIntegerField(null=True) # gender = models.CharField(max_length=64) 删除字段的方法: 直接注释对应字段的代码 +python manage.py makemigrations + python manage.py migrate 17.模型表数据的增删改查**************** 查: data = models.User.objects.filter(username=username) print(data) #<QuerySet [<User: User object>]> ''' filter 返回的结果是一个列表,里面才是真正的数据对象 filter 括号内可以放多个关键字参数,这多个关键字参数在查询的时候是and的关系不是or的关系 ''' user_list=models.User.objects.all() #查询出所有 print(user_list) #列表里面有4个对象<QuerySet [<User: User object>, <User: User object>, <User: User object>, <User: User object>]> #对象被打印会执行__str__方法 增: user_obj=models.User.objects.create(username=username,password=password) print(user_obj,user_obj.username,user_obj.password) #create方法会有一个返回值,返回值就是当前被创建的对象本身(如上面的user_obj) 改: #修改数据库中的数据 #sql语句:update User set username='jsdnn',password='123' where id=1; models.User.objects.filter(id=edit_id).update(username=username,password=password) #修改完毕 ''' 上面的更新语句属于批量操作,会将filter查询出来的列表中所有的对象全部更新 更新之后,重定向到用户列表页面 由于更新重要,所以我拷贝了一份完整的代码,以供查阅 def edit_user(request): ''' 返回编辑页面,编辑页面要含有用户的原来数据,提交后,保存数据到数据库 问题: 1.如何获取用户想要编辑的对应ID数据呢? 利用get请求携带参数的方式,获取用户想要编辑的数据id值 edit_id=request.GET.get('edit_id') 2.如何查询出来要编辑的数据 将用户想要编辑的数据查询出来,展示到编辑页面上,供用户修改 edit_obj=models.User.objects.filter(id=edit_id)[0] #支持索引取值,也支持切片操作,但是不支持负数 edit_obj=models.User.objects.filter(id=edit_id).first() 上面两行代码是同一个意思,查询出对应id的数据 return render(request,'edit_user.html',{'edit_obj':edit_obj}) :param request: :return: ''' edit_id = request.GET.get('edit_id') if request.method == 'POST': username=request.POST.get('username') password=request.POST.get('password') #修改数据库中的数据 #sql语句:update User set username='jsdnn',password='123' where id=1; models.User.objects.filter(id=edit_id).update(username=username,password=password) #修改完毕 ''' 上面的更新语句属于批量操作,会将filter查询出来的列表中所有的对象全部更新 更新之后,重定向到用户列表页面 ''' return redirect('/userlist/') edit_obj = models.User.objects.filter(id=edit_id).first() return render(request,'edit_user.html',{'edit_obj':edit_obj}) 删: #直接删除 models.User.objects.filter(id=delete_id).delete() ''' 批量操作,会将filter查询出来的列表中所有的对象全部删除 ''' 注意事项: password = models.CharField(max_length=64) 修改字段类型以后,必须下面的password由整形修改为varchar类型,也是需要提交这两句命令的 python manage.py makemigrations python manage.py migrate 然后数据库中的对应字段类型,才会从整形修改为字符串类型