路由访问:
如果不加斜杠 会内部自动加上,如果加上还没有会报错(内部会自动重定向)
静态文件配置:
所有的静态文件(css,js,前端第三方类库)默认都放在static文件夹下
STATIC_URL = '/static/' # static 接口前缀 跟你静态文件夹的名字一点关系都没有
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"), # static这个是静态文件夹,本地文件名
os.path.join(BASE_DIR, "static1"),
os.path.join(BASE_DIR, "static2")
]
ps:会依次查找列表所有的静态文件路径 找到的话立刻停止,都没有找到才会报错返回404
一般http://127.0.0.1:8080/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js
xxx表示接口,后面是路径,会依次查找静态配置文件的本地文件夹,去寻找信息
form表单触发提交数据的动作两种方式
<input type="submit">
<button></button>
form 提交数据的地址如何指定及方式
action属性控制提交的地址
方式:
1.全路径
<form action="http://127.0.0.1:8080/login/">
2.只写路径后缀
<form action="/login/"> #加上//会自动加上127.0.0.1:8080
3.不写默认往当前页面提交
form 表单默认是get请求(向服务端获取数据),post(向服务端发送请求)
<form action="" method="post">
根据客户端请求方式不同执行不同的代码逻辑:
可以分别执行get和post请求
1.第一种方式:
def login(request):
# 获取用户端提交的请求方式
print(request.method) # 默认拿到的请求方式是大写的字符串
if request.method =="GET":
return render(request,"login.html")
elif request.method =="POST":
return HttpResponse("服务器收到数据了")
2.第二种方式:( 推荐使用)
if request.method =="POST":
return HttpResponse("服务器收到数据了")
return render(request,"login.html")
# 推荐使用
POST请求(向服务端发送数据):
if request.method == "POST":
# print(request) #<WSGIRequest: POST '/login/'>
print(request.POST) # <QueryDict: {'username': ['kevin'], 'password': ['123']}>
print(request.POST.get("username")) # kevin values虽然是一个列表但是获取value的时候拿到却是单个元素
# 默认取最后一个
print(request.POST.getlist("username")) # 要想一次性取values里面所有数据需要用getlist
print(request.POST["password"]) # 123 不推荐使用这种方法
return HttpResponse("服务器收到数据了")
return render(request, "login.html")
获取用户value列表里面所偶遇元素需要用到getlist 应用场景:用户的爱好 多选框
.get只会获取到value列表最后一个数据
GET请求(获取服务端数据):
print(request.GET) ## <QueryDict: {'username': ['kevin'], 'password': ['123']}
# 获取get请求数据和POST方式一模一样
request.POST.get("username") 取单个
request.POST.getlist("username") 取多个
Django连接数据库
1.需要修改配置文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "day41",
"HOST": "127.0.0.1",
"PORT": 3306,
"USER": "root",
"PASSWORD": "123456"
}
}
PS:默认键必须大写
2.告诉Django用pymysql替换它默认mysql_db模块连接数据库
方式1.在你的项目文件夹(migrations)下面的__init__.py
方式2.也可以在你的应用名(app01)文件夹下__init__.py
# 固定写法
import pymysql
pymysql.install_as_MySQLdb() # 告诉Django用pymysql代替mysqldb连接数据库
django的orm:
对象关系映射:
类:表
对象:表记录
对象的属性:一条记录某个字段的值
django的orm不能帮你创建库,但是可以帮你创建表
提示:一个django项目使用一个库
数据库迁移命令(********)
python36 manage.py makemigrations (仅仅只是记录,不会创建表)将你的数据库变动记录到小本本上
python36 manage.py migrate 将你的数据变动记录同步到数据库中
django操作数据库增删改查
1.新增数据:
# 方式一:
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.id) # 获取主键
print(user_obj.name) # 获取name值
print(user_obj.password) # 获取password值
2.查询数据:
print(user_list.query) 可以查看内部执行的sql语句,只要是Queryset对象就可以查询sql语句
user_list = models.User.objects.all() 查询user表所有sql数据
利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但推荐写后缀即可
<a href="/reg/" class="btn btn-success">添加数据</a>
# 路径属性一定要加上/ /
ps:视图函数必须返回一个HttpResponse对象
重定向 可以写别人的网址也可以写服务端网址
return redirect("/userlist") # 内部重定向
3.删除数据:
#在跳转标签里把用户id一起发送过来
<a href="/delete_user/?delete_id={{ user.id }}" class="btn btn-danger ">删除</a>
删除:
models.User.objects.filter(id=delete_id).delete()
queryset对象支持索引取值 但是不推荐你使用 推荐使用自带.first()
查询方式一:
models.User.objects.filter(id=delete_id).first() 取出第一个,里面是一个列表对象,如果没有,会返回一个空对象,推荐使用
查询方式二:
user_obj = models.User.objects.get(id=edit_id) # 用get可以直接获取,不推荐 如果没有会报错
4.编辑:
编辑对象的id获取方式
方式一:利用input隐藏一个标签
<input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
方式二:直接写在form标签里携带过来,是get请求
<form action="/edit/?edit_id={{user_obj.pk}}" method="post">
更新:
第一种:
models.User.objects.filter(id=user_id).update(name=user_name,password=password) 推荐使用,执行效率高
第二种:
获取到当前数据对象
user_obj =models.User.objects.filter(id=user_id).first()
user_obj.name = username
user_obj.password = password
user_obj.save()
不推荐,对对象做了修改之后,所有的数据都要一起变化,效率极低
修改模型层里面的跟表相关的所有数据,只要你修改了就必须重新执行数据迁移命令
python36 manage.py makemigrations 记录到小本本
python36 manage.py migrate 操作数据库建立表字段