登陆功能
login.html
action:提交到后台的地址三种写法: 路由访问若是不加斜杠 会内部自动重定向加斜杠的路由 1 全路径 <form action="http://127.0.0.1:8000/login/"> 2 只写路径后缀 <form action="/login/"> 推荐用 3 不写 (默认往当前路径提交) form表单默认是get请求 method post方式 form表单触发提交数据的动做两种方式 <input type="submit" value="提交">或<button></button> type不能够是button <form action="http://127.0.0.1:8000/login" method="post"> <p>用户名:<input type="text" name="name" class="form-control"></p> <p > 密码:<input type="password" name="pwd" class="form-control"> </p> <input type="submit" value="提交"> </form>
view
1 request.method ----前台提交过来请求的方式 2 request.POST(至关于字典)----post形式提交过来的数据,(http请求报文的请求体重) 3 request.POST.get('name') ----推荐用get取值(取出列表最后一个值) 4 request.POST.getlist('name')-----取出列表全部的值_ 5 前台get方式提交的数据,从request.GET字典里取
连接数据库
cursor.execute('select * from user where name=%s and password=%s ',[name,pwd])
全部的静态文件(css,js,前端第三方类库)默认都放在static文件夹下css
html页面引入外部资源的方式 cdn 本地html
静态文件配置
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
根据客户端请求方式的不一样执行不一样的逻辑代码
def login(request): # 获取用户端提交的请求方式 print(request.method) # 拿到的请求方式是全大写的字符串 if request.method == 'GET': return render(request,'login.html') elif request.method == 'POST': return HttpResponse("收到了 老弟") 我的建议按照下面这种方式书写 减小代码冗余及结构混乱的问题 def login(request): if request.method == 'POST': return HttpResponse('OK') return render(request,'login.html') def login(request): # 获取用户端提交的请求方式 print(request.method) # 拿到的请求方式是全大写的字符串 # if request.method == 'GET': # return render(request,'login.html') # elif request.method == 'POST': # return HttpResponse("收到了 老弟") 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列表的最后一个元素 print(request.GET) # <QueryDict: {'username': ['jason'], 'password': ['123']}> request.GET.get('user') # <QueryDict: {'username': ['jason','egon'], 'password': ['123']}> request.GET.getlist('username')
django链接数据库 1.须要修改配置文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day54', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'123' } } ps:键必须都是大写 2.告诉django用pymysql替换它默认mysqldb模块链接数据库 方式1:在你的项目文件夹下面的__init__.py 方式2:也能够在你的应用文件夹下面的__init__.py # 固定写法 import pymysql pymysql.install_as_MySQLdb() # 告诉django用pymysql代替mysqldb链接数据库python
什么是ORM? 对象关系映射 类 》》》 表 对象 》》》 表记录 对象的属性 》》》 一条记录某个字段对应的值mysql
django的orm不可以自动帮你建立库,可是能够自动帮你建立表sql
提示:一个django项目就使用一个库,不要多个django项目使用一个库数据库
数据库迁移(同步)命令(******) python3 manage.py makemigrations 将你的数据库变更记录到一个小本本上(并不会帮你建立表) python3 manage.py migrate 将你的数据库变更正在同步到数据库中django
新增数据服务器
操做数据库user表插入数据
方式1:
user_obj = models.User.objects.create(name=username,password=password)函数
方式2:
user_obj = models.User(name=username,password=password) user_obj.save() # 对象调用save方法保存到数据库
查询数据
user_list = models.User.objects.all() # 获取user表全部的数据
只要是QuerySet就能够点query查看获取到当前QuerySet对象的内部sql语句
print(user_list.query)
利用a标签href属性 能够指定页面跳转的路径 href能够写全路径 可是推荐写后缀便可 <a href="/reg/" class="btn btn-success">添加数据</a>
注意 路径的书写必定要加斜杠
重定向 能够写别人的网址也能够是本身的路径 return redirect('/userlist') return redirect('/userlist/')
queryset对象支持索引取值 可是不推荐你使用 推荐使用自带的.first()帮你获取第一条数据
删除
models.User.objects.filter(id=1).delete() # 会将queryset全部的数据对象所有删除
查询数据须要注意的是你获取到的究竟是一个queryset仍是一个数据对象
user_query = models.User.objects.filter(id=edit_id).first() # 若是你是要获取数据对象first千万别忘了
filter当条件不存在的状况下会返回一个空的queryset对象
<QuerySet []> <class 'django.db.models.query.QuerySet'>
user_obj = models.User.objects.get(id=edit_id) # 用get能够直接获取到数据对象自己可是查询条件不存在的状况下直接报错
编辑
编辑对象的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()
修改模型层里面的跟表相关的全部的数据,只要你修改了就必须从新执行数据库迁移命令
python manage.py makemigrations 记录到小本本上 python manage.py migrate 真正操做数据库
django请求生命周期
图书管理系统表设计 书籍表
做者
出版社
外键字段名 orm会自动在字段名后面加_id.不管你的字段名有没有_id
ps:视图函数必须返回一个HttpResponse对象