Django ORM 实现数据的单表 增删改查

yizhihongxing

一、配置环境


1 Django 连接数据库(MySQL)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xyz',
        'USER':'root',
        'PASSWORD':'root',
        'HOST':'IP地址',
        'PORT':3306,
        'CHARSET':'utf8'
    }
}

2 Django 默认用的是 mysqldb 改为用 pymysql 连接

import pymysql
pymysql.install_as_MySQLdb()

3 安装 pymysql

pip3 install pymysql

4 定义 models

from django.db import models

# Create your models here.

class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True, verbose_name='主键')
    # username varchar(32)
    username = models.CharField(max_length=32, verbose_name='用户名')
    password = models.CharField(max_length=64, verbose_name='密码')

5 执行迁移,同步。顺序执行下面个代码(每次修改表都要顺序执行一遍)

python manage.py makemigrations
python manage.py migrate

6 定义 url

from django.contrib import admin
from django.urls import path
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    # 注册功能
    path('register/',views.reg),
    # 展示用户列表
    path('userlist/',views.userlist),
    # 编辑用户
    path('edit_user/',views.edit_user),
    # 删除用户
    path('delete_user/',views.delete_user)
]

 

二、增加


新建 templates\register.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1 class="text-center">注册</h1>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                <p>username:<input type="text"     name="username" class="form-control"></p>
                <p>password:<input type="password" name="password" class="form-control"></p>
                <input type="submit" class="btn btn-danger btn-block">
            </form>
        </div>
    </div>
</div>
</body>
</html>

获取用户数据,并存入数据库

from django.shortcuts import HttpResponse, render, redirect
from app import models

def register(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
       
        # 第一种增加
        # res = models.User.objects.create(username=username, password=password)
        # 返回值就是当前被创建的对象本身
        # print(res,res.username, res.password)

        # 第二种增加
        user_obj = models.User(username = username, password = password)
        # 保存数据
        user_obj.save()  
        
    # 先给用户返回一个注册页面
    return render(request, 'register.html')

 

三、查询


def userlist(request):
    # 查询出用户表里面所有的数据
    # 方式1
    # filter括号内可以携带多个参数 参数与参数之间默认是and关系。可以把filter 想成where
    # data = models.User.objects.filter()
    # print(data)

    # 方式2
    user = models.User.objects.all()
    # return render(request,'userlist.html', {'user_queryset':user_queryset})

    return render(request, 'userlist.html', locals())

新建 templates\userlist.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1 class="text-center">数据展示</h1>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <table class="table table-striped table-hover">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>username</th>
                        <th>password</th>
                        <th>action</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in user %}
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.username }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                                <a href="/edit_user/?user_id={{ user_obj.id }}"   class="btn btn-primary btn-xs">编辑</a>
                                <a href="/delete_user/?user_id={{ user_obj.id }}" class="btn btn-danger btn-xs">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>

 

四、修改


def edit_user(request):    # 获取url问号后面的参数    edit_id = request.GET.get('user_id')    # 查询当前用户想要编辑的数据对象    edit_obj = models.User.objects.filter(id = edit_id).first()    if request.method == "POST":        username = request.POST.get('username')        password = request.POST.get('password')        # 去数据库中修改对应的数据内容        # 修改数据方式1        # models.User.objects.filter(id=edit_id).update(username=username,password=password)        """            将filter查询出来的列表中所有的对象全部更新            批量更新操作            只修改被修改的字段        """        # 修改数据方式2        edit_obj.username = username        edit_obj.password = password        edit_obj.save()        """            上述方法当字段特别多的时候效率会非常的低            从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改        """        # 跳转到数据的展示页面        return redirect('/userlist/')    # 将数据对象展示到页面上    return render(request, 'edit_user.html', locals())

 新建 templates\edit_user.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>

<h1 class="text-center">编辑</h1>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.username }}"></p>
                <p>password:<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
                <input type="submit" class="btn btn-info btn-block" value="编辑">
            </form>
        </div>
    </div>
</div>
</body>
</html>

 

五、删除


def delete_user(request):
    # 获取用户要删除的数据 id值
    delete_id = request.GET.get('user_id')
    # 直接去数据库中找到对应的数据删除即可
    models.User.objects.filter(id = delete_id).delete()
    # 跳转到展示页面
    return redirect('/userlist/')

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django ORM 实现数据的单表 增删改查 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Django 创建 APP和目录结构介绍

    一、通过pip安装Django 以windows 系统中使用pip命令安装为例 win+r,调出cmd,运行命令:pip install django自动安装PyPi 提供的最新版本。指定版本,可使用 pip install django==4.0 这种形式。   二、创建项目 在windows 的cmd环境中,输入下面的命令: django-admin s…

    2023年4月2日
    00
  • Django manage.py 命令详解

    manage.py 查看命令的作用的语句 C:\Users\Administrator> python manage.py help Type ‘manage.py help <subcommand>’ for help on a specific subcommand. Available subcommands: [auth] chan…

    Python开发 2023年4月2日
    00
  • Django 测试脚本

    一、测试脚本 Django 在创建项目时自动在应用下创建了tests.py,这个py文件可以作为测试文件;也可以在应用下手动创建一个py测试文件。 无论哪种方式,都需要提前书写以下代码。 from django.test import TestCase # Create your tests here. import os “””Run administra…

    2023年4月2日
    00
  • Django 之ModelAdmin对象(补)

    一、后台管理系统配置 1 在该表对应的models类里面添加一个Meta类 class Meta: verbose_name_plural = ‘用户表’ ### 指定该表在admin后台的名字为: 用户表 # verbose_name = ‘用户表’ ### 末尾还是会自动加s   2 null=True,blank=True的区别 ### null=Tr…

    2023年4月2日
    00
  • Django ORM 事务和查询优化

    一、事务操作 模块 from django.db import transaction 1 开启事务:with transaction.atomic() from django.db import transaction class MyView(View): def post(self, request): ### 在with代码块中开启事务,出了with…

    Python开发 2023年4月2日
    00
  • Django 之中间件

    Django 之中间件

    Python开发 2023年4月2日
    00
  • Django 之路由层

    一、Django 请求周期生命流程图 首先,用户在浏览器中输入URL,发送一个GET 或 POST 方法的request 请求。 Django 中封装了socket 的WSGI 服务器,监听端口接受这个request 请求。 再进行初步封装,然后传送到中间件中,这个request 请求再依次经过中间件。 对请求进行校验或处理,再传输到路由系统中进行路由分发,…

    2023年4月2日
    00
  • Django 出现 frame because it set X-Frame-Options to deny 错误

    一、背景 使用 django3 进行开发时,由于项目前端页面使用iframe框架,浏览器错误提示信息如下 Refused to display ‘http://127.0.0.1:8000/’ in a frame because it set ‘X-Frame-Options’ to ‘deny’.  根据提示信息发现是因为 X-Frame-Options…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部