django框架基础二
一.静态文件
1.静态文件
什么是静态文件
网站所使用到的提前已经写好了的文件
css
js
第三方的组件
bootstrap
sweetalert
fontawesome
...
网站所用到的html文件统一放到templates文件夹中
那针对网站所使用到的静态文件也应该单独找一个文件夹来存储
这个文件夹 默认情况下都叫static
该文件夹需要手动自己创建
并且该文件夹内部通常是以下结构
static
-css
网站所用到的所有的css文件
-js
网站所用到的所有的js文件
-image
网站所用到的所有的图片文件
第三方文件
用户在浏览器窗口之所以输入网址能够拿到对应的资源
是因为后端开设相关的资源
2.django静态文件配置
django在配置文件中给你暴露了配置文件的配置信息 你只需要按照固定的写法书写
即可暴露对应的静态文件资源
基本配置
STATIC_URL = '/static/' # 访问后端静态资源的接口前缀 默认情况下接口前缀名与静态文件名保持一致
"""
<link rel="stylesheet" href="/xxx/bootstrap-3.3.7-dist/css/bootstrap.min.css">
你要想访问后端的静态资源 你必须以接口前缀开头 后面跟上具体的文件路径 才能够访问到对应的资源
当你的接口前缀正确之后 会拿着后面的路径依次去下面列表中的每一个文件夹下查找对应的资源
顺序是从上往下依次查找 如果都没有找到才会报错
"""
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 这里的static才是你文件夹的路径
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
如何解决动态绑定的问题(******)
{% 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>
form表单
form表单默认是以get请求提交数据的
http://127.0.0.1:8000/login/?username=admin&password=123
action
1.不写 默认朝当前地址提交数据
2.全路径
3.后缀(/index)
提交post请求的时候 需要先去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',
]
视图函数应该做到针对不同的请求 做出不同的处理逻辑
eg:
get请求来 应该只需要返回一个html文件 # 后缀是这样的一种:login/?username=积极磁场大&password=高大帅气
post请求来 应该获取用户提交的数据 然后做进一步处理
你必须要能够判断出当前请求到底是什么请求
3.get() 和 getlist()
login.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.js"></script>#}
{# <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>#}
{% 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>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h2 class="text-center">登录</h2>
<form action="" >
<p>username:<input type="text" name="username" value="111" class="form-control"></p>
<p>username:<input type="text" name="username" value="111" class="form-control"></p>
<p>password:<input type="text" name="password" value="111" class="form-control"></p>
<p><input type="submit" class="btn btn-warning" ></p>
</form>
</div>
</div>
</div>
</body>
</html>
views
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):
# if request.method=='GET':
#
# return render(request,'login.html')
# elif request.method=='POST':
# return HttpResponse('请求收到了,马上处理')
if request.method=='POST':
# return HttpResponse('收到了')
username = request.POST.getlist('username')
password = request.POST.get('password')
print(username,type(username))
print(password,type(password))
return HttpResponse('请求收到了,马上处理')
print(request.GET)###teplates 的form 里面的method 改成 GET或者 post不改在浏览器里面加上url?xxx=yyy&ooo=lll 刷新 不提交才可以执行get请求
username = request.GET.getlist('username')
password = request.GET.get('password')
print(username, type(username))
print(password, type(password))
return render(request,'login.html')
request对象
获取前端请求方式
request.method # 结果是一个纯大写的字符串 GET/POST
request.POST # 获取post请求提交的数据 类似于是一个大字典
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.POST.get() # 只会取列表最后一个元素
request.POST.getlist() # 取出整个列表
request.GET # 获取符合get请求携带数据格式的数据 url?xxx=yyy&ooo=lll
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.GET.get() # 只会取列表最后一个元素
request.GET.getlist() # 取出整个列表
通常情况下针对不同的请求应该做不同的处理 而一般情况下get请求次数要远远对于post请求
所以我们应该针对非get请求作出逻辑判断 将get请求直接写在函数体内而不做判断
def login(request):
# 要给用户返回一个登陆页面
# print('我被触发了')
# 获取前端请求方式
# if request.method == 'GET':
# # get逻辑
# return render(request, 'login.html')
# elif request.method == 'POST':
# # post逻辑
# # print(request.method,type(request.method)) # GET <class 'str'> POST <class 'str'>
# # 获取数据 之后...
# return HttpResponse('收到了你的数据 马上处理')
"""为了减少代码的层级:一般情况下视图函数处理get请求较多 所以可以直接再函数体内先写get请求对应的逻辑
将其他请求利用request.method做出区分
"""
if request.method == 'POST':
return HttpResponse('收到了')
return render(request,'login.html')
二.django链接MySQL数据库
1.先去配置文件中配置相关参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库类别
'NAME': 'day49', # 库的名字
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'password':'123',
'CHARSET':'utf8'
}
}
2.在项目名或者应用名下面的__init__文件中告诉django使用pymysql链接数据库而不是用默认的mysqldb
import pymysql
pymysql.install_as_MySQLdb()
django自带的有一个数据库,Database, 可以在这个上面链接mysql数据库或者其他的数据库,第一次链接的时候一定要特别注意:
最下方有一个:Download missing driver files 这个需要先下载一下,才可以
如果一个不行链接不上,在上方的Driver :MySQL 可以来选择。
django orm不会帮你创建库 只能帮你自动创建表
orm对象关系映射pytohn
类 表
对象 记录
属性 字段值
作用:能够让一个不会数据库操作的小白也能够通过Python面向对象语法 句点符来简单快捷的操作数据
首先需要先去对应的应用下的models.py中书写你的模型类
models.py
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32)
# password int
password = models.IntegerField()
*************************数据库迁移(同步)命令************************
1.python3 manage.py makemigrations # 仅仅是将你对数据库的改动记录到某个小本本上 (migrations文件夹)
2.python3 manage.py migrate # 将改动真正的同步到数据库中
"""
上面两个命令永远是成对出现的 只要你执行了1 就必须要执行2
"""
***********只要你动了models.py跟数据库相关的代码 你就必须要重新执行上面的两条命令来保证数据库与models.py一致***********
字段的增删改查
字段的增
1.要么给该字段设置默认值
email= models.EmailField(default= '123@qq.com') ##设置默认的值
2.要么运行该字段可以为空
hobby= models.CharField(null=True,max_length= 32)
字段的查
...
字段的改
修改models代码 之后执行数据库迁移命令即可
字段的删
只要注释掉对应的字段 执行数据库迁移命令就会将对应的字段及数据信息全部删除(慎用)
三.数据的增删改查
数据的增删改查
查
1.filter()
from app01 import models
res = models.User.objects.filter(username='jason') #res=<QuerySet [<User: User object>]> 相当于sql语句: select * from user where username='jason'
# 返回的结果是一个列表 支持索引取值但是不支持负数并且不推荐使用 推荐你使用它给你封装好的方法
user_obj = res.first()
# filter方法条件不存在的时候 不会报错返回的是一个空列表
"""
filter括号内直接放多个关键字参数 并且多个关键字参数之间是and关系
res = models.User.objects.filter(username='jason',password='123') # select * from user where username='jason' and password='123';
"""
2.查所有的数据
1.filter() 括号内不写拿所有
<QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>, <User: 你不行>]> 列表里面很多对象
2.all() 查询所有数据
<QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>, <User: 你不行>]>
增
1.create()
user_obj = models.User.objects.create(name=username,password=password)
print(user_obj,user_obj.name)
# 该方法有返回值 返回值就是当前被创建的对象本身
2.对象的绑定方法
# 方式2
# 1 先生成一个User对象
user_obj = models.User(name=username,password=password)
# 2 调用对象的绑定方法
user_obj.save()
删
用户点击谁 你的后端就应该删除
后端如何获取用户想要删除的数据id?
models.User.objects.filter(id=delete_id).delete() # 将filter过滤出来的数据全部删除 批量删除
改
如何获取用户想要修改的数据id
根据数据id获取数据并且展示到前端页面供用户查看
# 方式1(推荐) 批量更新
models.User.objects.filter(id=edit_id).update(name=username,password=password)
# 方式2(了解)
# 1 先获取数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 2 再修改对象属性
edit_obj.name = username
edit_obj.password = password
# 3 调用对象的绑定方法保存
edit_obj.save()
urls
rom django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^register/', views.register),
#用户展示页
url(r'^home/', views.home),
#删除用户
url(r'^del_user/', views.del_user),
#编辑功能
url(r'^edit_user/', views.edit_user),
]
models
from django.db import models
# Create your models here.
class User(models.Model):
id = models.AutoField(primary_key=True)
#下面的char就是varchar的意思
name= models.CharField(max_length=32)
password= models.CharField(max_length=32)
#新增一个字段
# email= models.EmailField(default= '123@qq.com')
# hobby= models.CharField(null=True,max_length= 32)
def __str__(self):
return self.name ####print(obj)的时候才会执行
views
from django.shortcuts import render, HttpResponse, redirect
from app01 import models
# Create your views here.
def login(request):
# 查询数据
# if request.method=='GET':
#
# return render(request,'login.html')
# elif request.method=='POST':
# return HttpResponse('请求收到了,马上处理')
if request.method == 'POST':
# return HttpResponse('收到了')
username = request.POST.get('username')
password = request.POST.get('password')
# print(username,type(username))
# print(password,type(password))
res = models.User.objects.filter(name=username)
print(res) # <QuerySet [<User: jason>]>
# user_obj = res.first()
# print(user_obj.name, user_obj.password)
if res:
user_obj = res.first()
if user_obj.password == password:
return HttpResponse('登录成功')
else:
return HttpResponse('密码错误')
return HttpResponse('请求收到了,马上处理')
# print(request.GET)
# username = request.GET.get('username')
# password = request.GET.get('password')
# print(username, type(username))
# print(password, type(password))
return render(request, 'login.html')
# 增加数据
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
###上面的数据是post后拿到的数据
# 直接往数据库中添加数据
# 方式一
# user_obj= models.User.objects.create(name=username,password=password)
# print(user_obj,user_obj.name) #这个print(obj)得到的结果是执行model里面的--str--返回的一个名字
# 方式二
# 1先生成一个User对象
user_obj = models.User(name=username, password=password)
# 2.调用对象的绑定方法
user_obj.save()
return HttpResponse('用户添加成功')
return render(request, 'register.html')
def home(request):
# 获取User表中的所有的数据
# res= models.User.objects.filter()
# 下面是第二种方法
user_queryset = models.User.objects.all()
return render(request, 'home.html', {'res': user_queryset})
def del_user(request):
# 如何获取用户想要删除的数据id
del_id = request.GET.get('del_id')
models.User.objects.filter(id=del_id).delete() # 删除filter过滤出来的数据全部删除
return redirect('/home/')
def edit_user(request):
# h获取用户想要修改的数据据的id
edit_id = request.GET.get('edit_id')
if request.method == 'POST':
# 获取用户修改之后的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# 根据id获取数据对象,并且展示到html页面上
# 修改数据
# 方式一推荐
models.User.objects.filter(id=edit_id).update(name=username,password=password)#home.html
#点击删除按钮 会触发链接 这个链接是/edit_user/?edit_id=xxxx的GET的请求
#方式二
# edit_obj=models.User.objects.filter(id=edit_id).first()
# #修改对象属性
# edit_obj.name= username
# edit_obj.password= password
# #调用对象的绑定方法
# edit_obj.save()
# 再次跳转到数据展示页
return redirect('/home/')
# 根据id获得的数据对象,并且展示到html页面上
edit_obj = models.User.objects.filter(id=edit_id).first()
return render(request, 'edit.html', {'edit_obj': edit_obj})
edit.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>
{% 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>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h2 class="text-center">编辑</h2>
<form action="" method="post">
<p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.name }}"></p>
<p>password:<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}"></p> ###value是默认出现的值 在浏览器页面
<input type="submit" class="btn btn-warning pull-right" >
</form>
</div>
</div>
</div>
</body>
</html>
home.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>
{% 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>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="text-center">数据展示</h1>
<table class="table table-striped table-hover"> {#striped是个表格样式增加斑马线样式,hover是鼠标悬停*/ #}
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>password</th>
<th>operation</th>
</tr>
</thead>
<tbody>
{% for user_obj in res %}
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.name }}</td>
<td>{{ user_obj.password }}</td>
<td>
<a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn-primary btn-xs">编辑</a>
<a href="/del_user/?del_id={{ user_obj.id }}" class="btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
register.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.js"></script>#}
{# <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>#}
{% 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>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h2 class="text-center">注册</h2>
<form action="" method="post" >
<p>username:<input type="text" name="username" value="积极气场大" class="form-control"></p>
{# <p>username:<input type="text" name="username" value="有男子汉气概" class="form-control"></p>}#}
<p>password:<input type="text" name="password" value="无论跟谁交谈 都能很吸引人" class="form-control"></p>
<p><input type="submit" class="btn btn-primary" ></p>
</form>
</div>
</div>
</div>
</body>
</html>
login.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.js"></script>#}
{# <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>#}
{% 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>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h2 class="text-center">登录</h2>
<form action="" method="post" >
<p>username:<input type="text" name="username" value="积极气场大" class="form-control"></p>
{# <p>username:<input type="text" name="username" value="有男子汉气概" class="form-control"></p>}#}
<p>password:<input type="text" name="password" value="无论跟谁交谈 都能很吸引人" class="form-control"></p>
<p><input type="submit" class="btn btn-warning" ></p>
</form>
</div>
</div>
</div>
</body>
</html>
数据库mysql
id name password
2 tank 123
3 jason 123
4 kavin 123
5 jason 123
6 egon 123