简谈django项目的创建配置,以及用户删除修改功能。
pycharm创建一个django项目注意点:
django项目的创建的两种方式:
1.命令行
1) django-admin startproject myfirstdjango(项目名字)
2)创建app python3 manage.py startapp app_01(app01为app名字)启动django
3)启动django python3 manage.py runserver
4)如何停止呢??ctrl+c
2pycharm创建
file新建项目,在application name中输入名字,为app的名字
pycharm将为你创建一个django项目,点击蓝色按钮即可执行一个裸的django项目。
templates与static文件及其配置
1)django默认的所有的html文件都存放在templates文件夹下
2)所有的静态文件(css,js)以及第三方的类库都存放在那个static文件夹下,所以我们需要新建一个static文件夹(跟app处于同级目录同时在static中导入我们需要的bootstrap,并新建css与js文件夹),注每个app都有可以有一个staic文件夹。
创建完了static文件夹及其子文件夹后需要对settings.py进行配置
暴露接口给外界访问static接口
STATIC_URL = ‘/static/’
static为接口前缀,若STATIC_URL = '/ssss/'则将原来的static改为ssss
<link rel="stylesheet" href="../ssss/bootstrap-3.3.7/css/bootstrap.min.css">
os.path.join(BASE_DIR,“static”),才是路径
STATIC_URL = ‘/static/’
STATICFILES_DIRS=[
os.path.join(BASE_DIR,“static”),
os.path.join(BASE_DIR,“static1”),
]因为每个app下都可以由templates与static
ps:会依次从该列表中查找。默认都是static
关于form表单提交数据:
提交数据的两种方式
第一种submit
<input type="submit">
button按钮
<button>button</button>
form表单提交数据的地址指定方式:
第一种全路径:
<form action="http://127.0.0.1:8000/reg/">
第二种只写后缀(浏览器会自动拿当前页面的host,ip帮你补全路径)
<form action="/reg/">
第三种不写默认路径提交到当前页面
注:form表单默认是GET请求,需要像后端提交form表单的数据时我们需要通过修改method的属性为post:
单这样还是不够的还需要修改setings.py中的middleware列表
后端获取前端数据方法:
首先是浏览器中输入网址,如本地回环(127.0.0.1:8000/login/)/login/为django的路由,然后django在urls.py中查找如存在改路由,则找到路由对应的视图函数,首先返回一个页面给用户,用户可以在该页面中输入内容,并提交给后端,后端首先判断是GET还是POST,(request.method)后端通过django封装好的request.(GET,POST).get()来获取前端数据。
def login(request):
print(request.method)
if request.method == 'POST':
print(request.POST) #可以看做是存放客户端POST请求提交的所有数据的字典
# request.POST:< QueryDict: {'username': ['wy'], 'password': ['123']} >
print(request.POST.get('username')) #虽然value是列表,但是默认取其中的最后一个数据
print(request.POST['username']) #不推荐使用该方法获取数据
print(request.POST.getlist('username')) #一次性获取value列表所有数据
return HttpResponse('OK')
print(request.GET) #跟request.POST获取数据方式一样
return render(request, 'login.html')
注意value列表里面所有元素可以通过getlist来获取呀,get只是获取列表的最后一个元素
还有就是不管是POST或者是GET,只要您路径携带了信息,后端都能够得到如(127.0.0.1:8000/login/?id=1 我们可以通过request.GET.get(“id”)拿到id的值呦),注意呦就是你的method为post的时候,你也可以用该方式携带参数,但是要以request.GET.get(“id”)举个实例。
当我们一些数据要给后端,但是不想显示在前端界面的时候,有两种方式呦:
方式一:
<form action="edit/?edit_id={{userobj.pk}}" method = "post">
方式二:通过hidden隐藏
<input type="hidden" name="edit_id" value={{userobj.pk}}>
django连接数据库:
django默认连接或者说自带的小型数据库sqlite3,一般用于本地测试。
你若要连接大型数据库或者其他数据库,你需要对settings.py中的DATABASES={}进行修改:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "day55",
'HOST':"127.0.0.1",
"PORT":3306,
"USER":"root",
"PASSWORD":"123"
}
}
同时在app的__init__…py文件中添加:
import pymysql
pymysql.install_as_MySQLdb()#告诉django用pymysql使用mysql
点击pycharm右侧的database,选择连接的数据库,一般一个django一个数据库
接着下载驱动
这样数据库就成功连接上了,如果中途没出现什么意外的话。
数据库迁移命令:
Django的ORM虽然不会自动帮我们创建库,但是会帮我们自动创建表,然而创建的过程还是需要我们配合的,并非全自动。
还需要在命令行窗口(比如pycharm里的terminal)输入以下命令:
python3 manage.py makemigrations #数据库变动的记录(并不会帮你创建表)
python3 manage.py migrate #将你的数据库变动同步到数据库中(这下才是真正创建表了)
注:数据迁移记录在migrations文件夹下。
tools选项中的Run manage.py Task敲命令更方便,因为有提示,而且不需要输入前面的python3 manage.py。(当然前期不推荐这么干,要不然完整命令都忘了,面试被问到了咋整)
只要修改了模型层(models.py)的与表相关的任何数据,都必须重新执行数据库迁移命令。
Django中的ORM
ORM概念:
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。
在ORM中,每一个类都映射数据库中的一张表。ORM的类都写在models.py中。
类 》》》 表
对象 》》》 表记录
对象的属性 》》》一条记录某个字段对应的值
操作数据库,无非就是增删改查,为了更好的演示,这里定义一个ORM类,然后假设前后端数据交互已完成。
这里先提一个QuerySet对象,Django操作数据库时,查询的all()和filter()方法返回的是QuerySet对象,有点像列表里面存放一个个对象,它可以用**.query**的方法获取其内部的mysql语句。如果要获取数据对象的话,可以用索引取,但是不推荐这么做,因为可能会报错,通常我们用QuerySet.first()等方法取其中的数据对象。
class User(models.Model):
# user表的主键字段名就是id,其实可以不写,因为Django默认会帮你创建主键ID
id = models.AutoField(primary_key=True)
# varchar(32) name字段是varchar(32) CharField在定义的时候必须要加max_length参数
name = models.CharField(max_length=32)
# varchar(16) name字段是varchar(32) CharField在定义的时候必须要加max_length参数
password = models.CharField(max_length=16)
增:
user_obj = models.User.objects.create(name=username,
password=password) #返回当前的数据对象
或者
user_obj = models.User(name=username, password=password)
user_obj.save() # 对象调用save方法保存至数据库
查:
user_list = models.User.objects.all()
print(user_list)
print(user_list.query) #只要是QuerySet对象,就能用.query获取它内部的MySQL语句
根据条件擦汗寻
res = models.User.objects.filter(id=delete_id)
#这样回来的是QuerySet对象,如果条件不存在返回空的QuerySet对象
res = models.User.objects.filter(id=delete_id).first()
#取出里面的第一个对象,虽然可以索引取,但是不推荐使用
根据条件查询直接拿一个数据对象(该方法不推荐使用,因为存在报错的情况)
res = models.User.objects.get(id=edit_id) #如果id不存在会直接报错
注意:get和filter相比,get能直接拿回一个数据对象,但是查询条件不满足时会报错。而filter查询条件满足或者不满足时返回的都是QuerySet对象,可以通过.first()、.last()取其中的数据对象,不存在报错的情况。所以一般选择用filter方法。
删:
models.User.objects.filter(id=delete_id).delete()
#会将该QuerySet里面的数据对象都删除掉(会同步到数据库)
改:
#方式一(推荐使用该方式):
models.User.objects.filter(id=edit_id).update(name=username, password=password)
#方式二:
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()
注意:QuerySet点语法,点删除和修改都会作用于对象内部所有的数据对象,类似于批量操作。
所以想要操作单个数据对象时,最好查时用能唯一标识一条数据的条件。
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.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">
<div class="col-md-4 col-md-offset-4">
<--! ?edit_id={{ user_obj.pk }} 用于在提交数据时获取值这个很关键-->
<form action="/edit/?edit_id={{ user_obj.pk }}" method="post">
{# <p><input type="hidden" name="edit_id" value="{{ user_obj.pk }}"></p>#}
<p>user_name <input type="text" name="username" value="{{ user_obj.name }}" class="form-control"></p>
<p>password <input type="text" class="form-control" name="password" value="{{ user_obj.password }}"></p>
<p> <input type="submit" class="btn btn-success"><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.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">
<div class="col-md-4 col-lg-offset-4">
<form action="" method="post">
<p><input type="text" name="user_name"></p>
<p><input type="text" name="password"></p>
<p><input type="submit" class="btn btn-success"></p>
</form>
</div>
</div>
</div>
</body>
</html>
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.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">
<div class="col-md-8 col-md-offset-2">
<form action="/reg/" method="post">
<p>username:<input type="text" name="username" class="form-control"></p>
<p>password<input type="text" name="password" class="form-control"></p>
<p><input type="submit" class="btn btn-success"></p>
</form>
</div>
</div>
</div>
</body>
</html>
userlist.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.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>
<style>
.c1{
margin-top: 50px;
}
</style>
</head>
<body>
<div class="container c1">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>password</th>
<th>action</th>
</tr>
</thead>
<tbody>
{% for userobj in userlist%}
<tr>
<td>{{ userobj.pk }}</td>
<td>{{ userobj.name }}</td>
<td>{{userobj.password}}</td>
<td>
<a href="/edit/?edit_id={{ userobj.pk }}" class="btn btn-success">编辑</a>
<a href="/delete/?delete_id={{userobj.pk}}" class="btn btn-danger">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
from django.shortcuts import render,redirect,HttpResponse
from app_01 import models
# Create your views here.
def reg(request):
print(request.method)
if request.method=="POST":
username=request.POST.get("username")
password = request.POST.get("password")
print(username,password)
query_set=models.USER_INFO.objects.filter(name=username)
# print(query_set.query)
print(query_set)
if not query_set:
print("create*************")
user_obj = models.USER_INFO.objects.create(name=username,password=password)
return redirect("/get_list/")
# return HttpResponse("注册成功")
else:
return HttpResponse("注册失败")
else:
return render(request,"reg.html",locals())
def login(request):
if request.method=="POST":
username = request.POST.get("user_name")
password = request.POST.get("password")
print(username, password)
query_set = models.USER_INFO.objects.filter(name=username,password=password)
if query_set:
userlist = models.USER_INFO.objects.all()
return redirect('/get_list/')
else:
return HttpResponse("登录失败")
return render(request,"login.html")
def get_list(request):
print(request.method)
userlist=models.USER_INFO.objects.all()
print(userlist)
# return render(request,"userlist.html",userlist)
# return HttpResponse("表格")
return render(request,"userlist.html",locals())
def delete(request):
print("delete")
print(request.method)
# 删除删除哪一个:
# 需要先得到id
delete_id = request.GET.get("delete_id")
print(delete_id)
models.USER_INFO.objects.filter(id=delete_id).delete()
userlist = models.USER_INFO.objects.all()
return render(request,'userlist.html',locals())
def edit(request):
# userlist = models.USER_INFO.objects.all()
# 删除点击删除让用户查看到自己的数据,到另一页面上去,然后将数据提交到
print('edit')
if request.method=="POST":
edit_id = request.GET.get("edit_id")#用来获取/?id={{}} 的内容
print(edit_id)
print("post")
name = request.POST.get("username")
password = request.POST.get("password")
print(name,password)
user_obj = models.USER_INFO.objects.filter(id=edit_id).update(name=name,password=password)
return redirect("/get_list/")
else:
print("get")
edit_id = request.GET.get("edit_id")
print(edit_id)
user_obj=models.USER_INFO.objects.filter(id=edit_id).first()
return render(request,'edit.html',locals())
def first(request):
return render(request,"first.html")