Django学习——2.Django的模型层

本文详细介绍了如何使用Django ORM在mydemo1项目中创建数据库表users,定义User模型,以及实现增删改查操作。涉及模型类定义、数据库配置、视图和模板的配合,是Django入门的好例子。
摘要由CSDN通过智能技术生成

项目名:mydemo1

Python版本:3.7.0

Django版本:3.2.0


Django模型(数据库)介绍

  • 模型是项目中的数据信息源,包含着储存数据的必要字段和行为。
  • 每个模型对应数据库中的一张表,每个属性对应一个字段。
  • 每个模型都是django.db.models.Model的一个子类
  • Django 为这些数据库提供了统一的调用接口(API),我们可以根据具体需求选择数据库。
  • 模型与数据库的关系是ORM关系(对象-关系-映射),用于实现面向对象编程语言里不同类型系统的数据之间的转换。 

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

 Model模型的实例

  • 模型实例对象通过objects获取,即Django为模型类提供的管理器。

objects:是Manager类型的对象,用于与数据库进行交互。

实例方法

__str__(self):重写object方法,此方法在对象转换成字符串时被调用。

save():将模型对象保存到数据表。

delete():从数据表中删除模型对象 。


 Model模型的实际操作

  1.创建数据库和表

  • 进入MySQL数据库创建数据库:mytest
  • 进入数据库创建数据表:users
  • 添加几条初始数据 

      

 2.创建项目和应用

 创建项目mydemo1

django-admin startpeoject mydemo1

 创建应用myapp

python manage.py startapp myapp 

 在项目中创建模板目录templates

  1. 在templates下创建myapp的目录
  2. 在myapp目录中创建users目录
  3. 在users中创建4个html文件:index.html,add.html,edit.html,menu.html,info.html

 

 

 

在mydemo1/mydemo1/settings.py中配置数据库连接

ALLOWED_HOSTS = ['*']  配置自己的服务器ip地址

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',   #添加自己的应用
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR),'templates'],   #配置模板路径
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

#配置数据库连接
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mytest',
        'USER':'root',
        'PASSWORD':'root',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

在mydemo1/mydemo1/__init__.py中使用pymysql模块连接mysql数据库

import pymysql

pymysql.install_as_MySQLdb()

 3.定义Model类

 在mydemo1/myapp/models.py中定义各属性

from django.db import models
from datetime import datetime

# Create your models here.
class Users(models.Model):
    id = models.AutoField(primary_key=True)  #id为主键,可以省略
    name=models.CharField(max_length=32)   #姓名,最大长度32
    age=models.IntegerField(default=20)     #年龄,默认20
    phone=models.CharField(max_length=16)   #电话号码
    addtime=models.DateTimeField(default=datetime.now())  #最后修改时间

 4.实现Web端访问

 修改mydemo1/mydemo1/urls.py文件,配置对myapp应用路由的访问连接配置

from django.urls import path,include

urlpatterns = [
    path('',include('myapp.urls'))
]

 对myapp/urls.py进行路由配置

from django.urls import path,include
from . import views

urlpatterns=[
    path('',views.index,name='index'),
    #配置users信息操作路由
    path('users',views.indexUsers,name='indexusers'),  #浏览用户信息
    path('users/add',views.addUsers,name='addusers'),  #添加用户信息表单
    path('users/insert',views.insertUsers,name='insertusers'), #用户信息插入操作
    path('users/del/<int:uid>',views.delUsers,name='delusers'), #用户信息删除操作,<int:uid>代表用户的具体id
    path('users/edit/<int:uid>',views.editUsers,name='editusers'), #加载用户信息编辑表单
    path('users/update',views.updateUsers,name='updateusers'),  #用户信息编辑操作
]

编写mydemo1/myapp/views.py视图文件

from django.shortcuts import render
from django.http import HttpResponse
from myapp.models import Users

def index(request):
    return HttpResponse('没有找到用户信息')

#加载添加用户信息表单
def addUsers(request):
    return render(request,'myapp/users/add.html')
#执行用户信息添加
def insertUsers(request):
    try:
        ob=Users()
        #从表单中获取要添加的信息并封装到ob对象中
        ob.name=request.POST['name']
        ob.age = request.POST['age']
        ob.phone = request.POST['phone']
        ob.save()
        context={'info':'添加成功'}

    except:
        return HttpResponse('添加失败')
    return render(request,'myapp/users/info.html',context)
#执行用户信息删除
def delUsers(request,uid=0):
    try:
        ob=Users.objects.get(id=uid)
        ob.delete()
        context={'info':'删除成功'}
        return render(request, 'myapp/users/info.html',context)
    except:
        context={'info':'删除失败'}
        return render(request,'myapp/users/info.html',context)
#加载用户信息修改表单
def editUsers(request,uid=0):
    try:
        ob=Users.objects.get(id=uid)
        context={'user':ob}
        return render(request,'myapp/users/edit.html',context)
    except:
        context={'user':'没有找到要修改的数据'}
        return render(request,'myapp/users/info.html',context)
#执行用户信息修改
def updateUsers(request):
    try:
        uid=request.POST['uid']
        ob=Users.objects.get(id=uid)
        #从表单中获取要添加的信息并封装到ob对象中
        ob.name=request.POST['name']
        ob.age = request.POST['age']
        ob.phone = request.POST['phone']
        ob.save()
        context={'info':'修改成功'}

    except:
        return HttpResponse('修改失败')
    return render(request,'myapp/users/info.html',context)

编辑各个视图文件

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        function doDel(uu){
            if(confirm('确定要删除吗?')){
            window.location=uu;
           }
        }
    </script>
</head>
<body>
    <center>
        <h1>用户信息管理</h1>
        <a href="{% url 'indexusers' %}">浏览信息</a>
        <a href="{% url 'addusers' %}">添加信息</a>
        <hr>
        <h3>浏览用户信息</h3>
        <table width="800px" border="1">
            <tr>
                <th>ID号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>电话</th>
                <th>添加时间</th>
                <th>操作</th>
            </tr>
            {% for user in userslist %}
                <tr>
                    <td>{{user.id}}</td>
                    <td>{{user.name}}</td>
                    <td>{{user.age}}</td>
                    <td>{{user.phone}}</td>
                    <td>{{user.addtime}}</td>
                    <td>
                        <a href="{% url 'editusers' user.id %}">编辑</a>
                        <a href="javascript:doDel('{% url 'delusers' user.id %}');">删除</a>
                    </td>
                </tr>
            {% endfor %}
        </table>
    </center>

</body>
</html>

注:{% csrf_token %}的作用是当我们get表单页面时,服务器返回页面的同时也会向前端返回一串随机字符,post提交时服务器会验证这串字符来确保用户是在服务端返回的表单页面中提交的数据,防止有人通过例如jquery脚本向某个url不断提交数据,是一种数据提交的验证机制。(转载于:https://www.cnblogs.com/Peter2014/p/8596145.html)

add.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <center>
        <h1>用户信息管理</h1>
        <a href="{% url 'indexusers' %}">浏览信息</a>
        <a href="{% url 'addusers' %}">添加信息</a>
        <hr>
        <h3>添加用户信息</h3>
        <form action="{% url 'insertusers' %}" method="post">
            {% csrf_token %}
            <table width="280" border="0">
                <tr>
                    <td>姓名:</td>
                    <td><input type="text" name="name"></td>
                </tr>
                <tr>
                    <td>年龄:</td>
                    <td><input type="text" name="age"></td>
                </tr>
                <tr>
                    <td>电话:</td>
                    <td><input type="text" name="phone"></td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="添加">
                        <input type="reset" value="重置">
                    </td>
                </tr>
            </table>
        </form>
    </center>

</body>
</html>

 

edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <center>
        <h1>用户信息管理</h1>
        <a href="{% url 'indexusers' %}">浏览信息</a>
        <a href="{% url 'addusers' %}">添加信息</a>
        <hr>
        <h3>修改用户信息</h3>
        <form action="{% url 'updateusers' %}" method="post">
            {% csrf_token %}
            <input type="hidden" name="uid" value="{{user.id}}">
            <table width="280" border="0">
                <tr>
                    <td>姓名:</td>
                    <td><input type="text" name="name" value="{{user.name}}"></td>
                </tr>
                <tr>
                    <td>年龄:</td>
                    <td><input type="text" name="age" value="{{user.age}}"></td>
                </tr>
                <tr>
                    <td>电话:</td>
                    <td><input type="text" name="phone" value="{{user.phone}}"></td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="修改">
                        <input type="reset" value="重置">
                    </td>
                </tr>
            </table>
        </form>
    </center>

</body>
</html>

 

 

 info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加</title>
</head>
<body>
    <center>
        <h1>用户信息管理</h1>
        <a href="{% url 'indexusers' %}">浏览信息</a>
        <a href="{% url 'addusers' %}">添加信息</a>
        <hr>
        <h3>操作提示信息</h3>
        <h4>{{info}}</h4>
    </center>
</body>
</html>

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值