Django(三)

Django(三)

ORM的增删改查

模板变量的分配

"""第一种方式"""
def ab_render(request):  # 模板语法,写在views中
    user_dict = {'username': 'lisi', 'password': 123}
    return render(request, 'ab_render.html', {'user_dict': user_dict})  # Django中html就是模板文件
"""
	在html中用{{ user_dict }}这么使用
	作用为在html中可以使用这个字典
"""
"""第二种方式"""
	print(locals())  # 会把该函数中所有局部变量都分配到模板文件中
    return render(request, 'ab_render.html', locals())

用户数据的修改

# 1. 点击修改按钮,应该跳转一个修改页面
# 2. 页面中应该展示出你修改的这条记录的原来的值
# 3. 点击修改按钮,应该把当前记录的id值传到后端去
# 4. 后端应该接收这个id值,然后拿着这个id值当成查询条件去数据库中查询,得到这条记录的对象
# 5. 把查询出来的数据对象,分配到模板文件中,展示出来

注册登陆删除等操作实例

"""注册页面"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/js/jquery-3.6.4.min.js"></script>
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>
<h1 class="text-center">注册页面</h1>
<div class="container">
    <div class="row">
        <form action="" method="post">
            <div class="form-group">
                用户名: <input type="text" name="username" class="form-control">
            </div>
            <div class="form-group">
                密码: <input type="password" name="password" class="form-control">
            </div>
            <div class="form-group text-center">
                <input type="submit" value="注册" class="btn btn-primary">
            </div>
        </form>
    </div>
</div>
</body>
</html>
"""注册方法"""
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')  # 接收网页提交来的用户名
        password = request.POST.get('password')  # 接收网页提交来的密码
        # res = models.Info.objects.create(username=username, password=password)  # 返回的是当前插入的对象,第一种注册方式
        res = models.Info(username=username,password=password)
        res.save()  # 第二种注册方式
        return redirect('/user_list/')
    return render(request, 'register.html')

"""打印出所有用户的列表"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/js/jquery-3.6.4.min.js"></script>
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <h1 class="text-center">用户列表</h1>
        <div class="col-md-10 col-lg-offset-1">
            <table class="table table-striped table-hover">
                <thead>
                <tr>
                    <td class="text-center">id</td>
                    <td class="text-center">username</td>
                    <td class="text-center">password</td>
                    <td class="text-center">操作</td>
                </tr>
                </thead>
                <tbody>
                {% for foo in user_date %}
                    <tr>
                        <td class="text-center">{{ foo.id }}</td>
                        <td class="text-center">{{ foo.username }}</td>
                        <td class="text-center">{{ foo.password }}</td>
                        <td class="text-center">
                            <a href="/edit/?edit_id={{ foo.id }}" class="btn btn-success btn-xs">修改</a>
                            <a href="/del_user/?del_id={{ foo.id }}" class="btn btn-danger btn-xs">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>

"""用户列表方法"""
def user_list(request):
    user_date = models.Info.objects.all().filter(is_delete=False)  # 查询所有
    return render(request, 'user_list.html', locals())

"""修改页面"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
    <script src="/static/js/jquery-3.6.4.min.js"></script>
    <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>
<h1 class="text-center">修改页面</h1>
<div class="container">
    <div class="row">
        <form action="" method="post">
            <div class="form-group">
                用户名: <input type="text" name="username" class="form-control" value="{{ edit_date.username }}">
            </div>
            <div class="form-group">
                密码: <input type="password" name="password" class="form-control" value="{{ edit_date.password }}">
            </div>
            <div class="form-group text-center">
                <input type="submit" value="修改" class="btn btn-primary">
            </div>
        </form>
    </div>
</div>
</body>
</html>
"""修改方法"""
def edit(request):
    edit_id = request.GET.get('edit_id')
    edit_date = models.Info.objects.filter(pk=edit_id).first()  # 查询的是主键就可以写pk不写具体的字段名

    if request.method == 'POST':
        username = request.POST.get('username')  # 接收网页提交来的用户名
        password = request.POST.get('password')  # 接收网页提交来的密码

        models.Info.objects.filter(pk=edit_id).update(username=username, password=password)  # 第一种修改方式
        # edit_date.username = username
        # edit_date.password = password
        # edit_date.save()  # 第二种修改方式
        return redirect('/user_list/')
    return render(request, 'edit.html', locals())

"""删除方法"""
def del_user(request):
    del_id = request.GET.get('del_id')
    # models.Info.objects.filter(pk=del_id).delete()  # 不能直接删除
    models.Info.objects.filter(pk=del_id).update(is_delete=True)
    return redirect('/user_list/')

ORM创建表关系

"""
	一对一
	一对多
	多对多
"""

图书表   出版社表  作者表  作者详情表
# 作者与作者详情表是一对一的关系
'''外键字段建在任何一方都可以,一般建在查询频率较高 的表'''
info_id = models.OneToOneField(to='info')  # 不管位置在哪儿都给对方表加上引号
,on_delete=models.CASCADE  # 如果是Django2以上需要在括号里加这句,Django1默认级联更新级联删除

# 图书和作者是多对多的关系
'''外键字段建在第三张表,使用虚拟字段建立第三张表,虚拟字段建在任何一张表中都是可以的,建在查询频率较高的一张表'''
authors = models.ManyToManyField(to='author')  # authors是一个虚拟字段,不会在book表中创建出authors字段,作用就是用来告诉Django创建第三张表

# 图书和出版社是一对多的关系
'''外键字段建在多的一方,书是多,外键建在book表中'''
publish_id = models.ForeignKey(to='Publish',to_field='id')  # 如果关联的事对方表的主键可以省略不写,否则必须写上to_field='?'

'''用ORM创建以上三种关系'''
# 创建外键关系的时候,先创建一张表中得基础字段,在创建外键字段

'''在django1中,默认是级联删除级联更新'''
'''在django2中,现在的创建代码就不行了'''


on_delete参数

on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。

models.CASCADE
删除关联数据,与之关联也删除

models.DO_NOTHING
删除关联数据,引发错误IntegrityError

models.PROTECT
删除关联数据,引发错误ProtectedError

models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

Django请求生命周期

img

WSGI, uWSGI, uwsgi一文搞

# WSGI是一个协议,wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 django的交互和调用就需要一个统一的规范,这个规范就是WSGI WSGI(Web Server Gateway Interface)
posted @ 2023-04-23 20:31  橘子熊何妨  阅读(28)  评论(0)    收藏  举报