简谈django项目的创建配置,以及用户删除修改功能。

简谈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")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值