Django入门
一、django介绍
①启用django注意事项(*****): 计算机的名称不能有中文 一个pycharm就是一个项目 项目名不能起中文
②下载: 推荐下载1.11.11版本 两种下载方式: 命令行直接下载:pip3 install django==1.11.11 pycharm下载 验证下载是否成功: cmd --> django-admin
③创建django项目的两种方式: 方式一:命令行创建 创建django项目:cmd -> D: -> django-admin startproject 项目名 创建app应用: cd 项目名 -> python3 manage.py startapp app01 启动django项目:python3 manage.py runserver ps:用命令行创建django默认不会自动创建templates文件夹 需要你手动自己创建(注意改文件夹路径是否被添加配置文件中)
方式二:pycharm创建 创建django项目:file >>> new project 选择第二个django ps:需要注意名字不能有中文,选择本地的解释器,勾选后台管理 创建app:方式一:pycharm命令行创建 -> python3 manage.py startapp app01 方式二:Tools下面run manage.py task功能栏 -> startapp app01 启动点击小绿色箭头
强调:1.用django一定要保证只有一个在运行状态 2.一定记得清浏览器的缓存 ④app应用概念: 一个django项目就是一所大学 app就是大学里面的学院 注意:新创建的app需要在配置文件中注册才能生效(*****) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config' # 可以用全称 'app01' # 也可以简写 ]
二、Django各个文件的作用
三、Django三板斧
from django.shortcuts import render,HttpResponse,redirect ①HttpResponse 返回字符串 HttpResponse('hello world') ②render 返回一个html页面 render(request, 'reg.html') 两种给前端页面传值的方式 方式一:def reg(request): user_dict = {'name':'jason','password':'123'} return render(request,'reg.html',{'user_dict':user_dict}) 方式二:def reg(request): user_dict = {'name':'jason','password':'123'} return render(request,'reg.html',locals()) ③redirect 重定向 redirect('http://www.xiaohuar.com') django识别到你的代码变化之后会自动刷新,但是有时候反应速度比较慢, 你可以手动重启,也可以多刷新几次浏览器
四、动静态网页
静态网页:页面上的数据都是写死的 动态网页:页面上的数据是从后端动态获取的 比如后端获取当前时间 后端获取数据库数据然后传递给前端页面
五、模板渲染
后端生成的数据直接传递给前端页面使用(并且前端页面可以灵活的操作改数据) 模板渲染:模板语法需要依赖于第三方模块: pip3 install jinja2 模板语法:inja2支持前端直接使用类似于python的语法操作数据 <p>{{ user_dic }}</p> <p>{{ user_dic.name }}</p> <p>{{ user_dic['password'] }}</p> <p>{{ user_dic.get('name') }}</p> {% for user in user_dict %} <!--[{},{},{},{}]--> <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.password }}</td> </tr> {% endfor %}
六、静态文件配置
静态文件配置 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露给外界能够访问服务器静态文件夹下面所有的资源 STATIC_URL = '/xxx/' # 接口前缀 跟你的静态文件夹的名字一点关系都没有 # 默认情况下这个前缀跟静态文件夹名字一样!!! # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), # 就是你的静态文件夹路径 os.path.join(BASE_DIR,'static1'), os.path.join(BASE_DIR,'static2') ] # ps:会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404
七、form用get和post提交数据
1、form提交数据的地址指定的三种方式
action属性控制提交的地址 方式: 1.全路径 <form action="http://127.0.0.1:8000/login/"> 2.只写路径后缀 <form action="/login/"> 3.不写 (默认往当前路径提交) form表单默认是get请求
2、post与get执行代码块
def login(request): if request.method == 'POST': return HttpResponse('OK') return render(request,'login.html')
def login(request): # 获取用户端提交的请求方式 print(request.method) # 拿到的请求方式是全大写的字符串 if request.method == 'POST': print(request.POST) # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据 # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} > print(request.POST.get('username')) # value虽然是个列表但是获取value的时候拿到却是单个元素 # 默认只会取value列表里面的最后一个元素 # request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}> print(request.POST.getlist('username')) # 要想一次性获取value列表里面所有的数据需要用getlist() # ['jason', 'egon'] print(request.POST['password']) # 不推荐使用该方法获取数据 return HttpResponse('OK') return render(request,'login.html') # 获取value列表里面所有的元素需要使用getlist 应用场景:用户的爱好 多选框 # get只会获取到value列表的最后一个元素 # 获取get请求数据的方式跟post请求完全一样 print(request.GET) # <QueryDict: {'username': ['jason'], 'password': ['123']}> request.GET.get('user') # <QueryDict: {'username': ['jason','egon'], 'password': ['123']}> request.GET.getlist('username')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <h1>登录页面</h1> <div class="col-md-6 col-md-offset-3"> <form action="" method="post"> <p>username:<input type="text" class="form-control" name="username"></p> <p>password:<input type="password" class="form-control" name="password"></p> <input type="submit" class="btn btn-primary"> </form> </div> </div> </div> </body> </html>
八、django连接数据库
1.需要修改settings配置文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day54', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'3822515' } } ps:键必须都是大写 2.告诉django用pymysql替换它默认mysqldb模块连接数据库 方式1:在你的项目文件夹下面的__init__.py 默认在此init里写 方式2:也可以在你的应用文件夹下面的__init__.py # 固定写法 import pymysql pymysql.install_as_MySQLdb() # 告诉django用pymysql代替mysqldb连接数据库
九、ORM
什么是ORM:
对象关系映射
类 >>> 表
对象 >>> 表记录
对象的属性 >>> 一条记录某个字段对应的值
django的orm不能够自动帮你创建库,但是可以自动帮你创建表,所以需要自己手动创建库
提示:一个django项目就使用一个库,不要多个django项目使用一个库
十、数据库迁移命令
1、方式一:pycharm命令行
python3 manage.py makemigrations # 将你的数据库变动记录到一个小本本上(并不会帮你创建表) python3 manage.py migrate # 将你的数据库变动正在同步到数据库中
2、方式二:快捷键Tools
Tools --->>> Run manage.py Task
makemigrations
migrate
十一、ORM操作数据库
1、新增数据
# 方式1: user_obj = models.User.objects.create(name=username,password=password) # 方式2: user_obj = models.User(name=username,password=password) user_obj.save() # 对象调用save方法保存到数据库
def reg(request): if request.method == 'POST': # 获取用户名输入的用户名和密码 username = request.POST.get('username') password = request.POST.get('password') # 操作数据库user表插入数据 # 方式一 # user_obj = models.User.objects.create(name=username, password=password) # 方式二 # user_obj = models.User(name=username, password=password) # user_obj.save() # 对象调用save方法保存到数据库 print(user_obj) print(user_obj.pk) # 获取主键字段对应的值,无论你的主键叫什么名字 print(user_obj.name) # 获取用户数据的name值 print(user_obj.password) # 获取用户数据的password值 return HttpResponse('注册成功') return render(request, 'reg.html')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <h1>注册页面</h1> <div class="col-md-8 col-md-offset-2"> <form action="" method="post"> <p>username:<input type="text" name="username" class="form-control"></p> <p>password<input type="password" name="password" class="form-control"></p> <input type="submit" class="btn btn-primary"> </form> </div> </div> </div> </body> </html>
2、查询数据
user_list = models.User.objects.all() # 获取user表所有的数据 # 只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句 print(user_list.query)
def userlist(request): # 获取数据库数据 user_list = models.User.objects.all() # 获取user表中所有的数据 select * from user return render(request, 'userlist.html', locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <h1>展示数据</h1> <div class="col-md-8 col-md-offset-2"> <a href="/reg/" class="btn btn-success">添加数据</a> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <th>id</th> <th>name</th> <th>password</th> <th>action</th> </tr> </thead> <tbody> {% for user_obj in user_list %} {# user_list = [obj1,obj2,obj3] #} <tr> <td>{{ user_obj.pk }}</td> <td>{{ user_obj.name }}</td> <td>{{ user_obj.password }}</td> <td> <a href="/edit/?edit_id={{ user_obj.pk }}" class="btn btn-primary">编辑</a> <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-danger">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
3、删除数据
models.User.objects.filter(id=1).delete() # 会将queryset所有的数据对象全部删除
def delete_user(request): # 从get请求携带的参数中获取用户想要删除的数据id delete_id = request.GET.get('delete_id') # print(delete_id) models.User.objects.filter(id=delete_id).delete() # print(res) # <QuerySet [<User: tank>]> # print(type(res)) # <class 'django.db.models.query.QuerySet'> return redirect('/userlist/')
4、编辑数据
编辑对象的id的获取方式 方式1:利用input隐藏一个标签 <input type="hidden" name="edit_id" value="{{ user_obj.pk }}"> 方式2: <form action="/edit/?edit_id={{ user_obj.pk }}" method="post"> 注意:queryset对象点修改 删除 会作用于对象内部所有的数据对象 类似于批量操作 方式1: models.User.objects.filter(id=edit_id).update(name=username,password=password) 方式2:获取到当前数据对象 user_obj = models.User.objects.filter(id=edit_id).first() user_obj.name = username user_obj.save()
def edit(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 获取编辑对象id的方式 edit_id = request.POST.get('edit_id') # 更新数据库 models.User.objects.filter(id=edit_id).update(name=username, password=password) return redirect('/userlist/') # 获取用户想要修改的数据的id edit_id = request.GET.get('edit_id') # 将该数据查询出来渲染到一个编辑页面 # 查询方式一 user_obj = models.User.objects.filter(id=edit_id).first() # 查询方式二 # user_obj = models.User.objects.get(id=edit_id) # 将当前数据渲染到一个编辑页面上 return render(request, 'edit.html', locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <h1>编辑页面</h1> <div class="col-md-6 col-md-offset-3"> <form action="" method="post"> <input type="hidden" name="edit_id" value="{{ user_obj.pk }}"> <p>username:<input type="text" name="username" class="form-control" value="{{ user_obj.name }}"></p> <p>password:<input type="text" name="password" class="form-control" value="{{ user_obj.password }}"></p> <input type="submit" class="btn btn-warning"> </form> </div> </div> </div> </body> </html>