django6 案例一对一增删改

1创建新项目的准备工作

1.1命令框内创建新项目

打开指定文件夹,在路径位置输入cmd打开命令行
django-admin startproject 项目名 创建项目

1.2在新项目内创建子应用

python manage.py startapp 子应用名

1.3注册子应用

在settings.py文件内注册子应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    '创建的子应用名'    #注册子应用
]

1.4配置模板

在settings.py文件内配置模板

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',
            ],
        },
    },
]

1.5配置数据库

在settings.py文件内

# 配置数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 使用mysql数据库
        'HOST': 'localhost',  # 主机
        'PORT': 3306,  		# 端口
        'USER': 'root',  	# 数据库的用户名
        'PASSWORD': '密码', # 数据库的密码
        'NAME': '创建的数据库名',  	# 数据库的名字
    }
}

1.6修改语言和时区

在settings.py文件内

LANGUAGE_CODE = 'zh-Hans'  #语言

TIME_ZONE = 'Asia/Shanghai'  #时区

1.7配置静态文件

在settings.py文件内

# 配置静态资源(现在基本上用不到)
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]  #配置路径,在根目录创建文件夹

1.8常用的mysql代码语句

查看所有数据库: show databases;
创建数据库: create database 数据名 charset=utf8;
删除数据库: drop database 数据库名;
调用数据库: use 数据库名;
查看数据库下的所有表: show tables;
查看表结构: desc 表名;
查看表中的所有数据: select * from 表名;

1.9安装数据库

在跟项目名同名的文件夹内init.py文件里安装

import pymysql
pymysql.install_as_MySQLdb()

1.9.1创建模型类

在子应用文件夹里的models.py创建

# 模型类 会自动生成 id字段
#老师模型类
class Teacher(models.Model):
    tea_name=models.CharField(max_length=20,verbose_name='老师姓名')
    course=models.CharField(max_length=20,verbose_name='所授课程')

    class Meta:
        verbose_name='老师表'
        verbose_name_plural=verbose_name
        db_table='teacher'
    def __str__(self):
        return self.tea_name

#学生模型类
class Student(models.Model):
    stu_name = models.CharField(max_length=20, verbose_name='老师姓名')
    height = models.DecimalField(max_digits=5,decimal_places=2,verbose_name='身高')
    face=models.IntegerField(default=60,verbose_name='颜值')
    teacher=models.ForeignKey(Teacher,on_delete=models.CASCADE,verbose_name='老师')#外键
    class Meta:
        verbose_name = '学生表'
        verbose_name_plural = verbose_name
        db_table = 'student'

    def __str__(self):
        return self.stu_name

1.9.2创建好模型类后进行迁移

在项目内终端执行
生成迁移文件:python manage.py makemigrations
执行迁移:python manage.py migrate
如果迁移出错,把数据库删了创建新的数据库,生成的迁移文件也删了,重新执行上面2个步骤

1.9.3创建超级用户

创建超级用户 (python终端内运行)
python manage.py createsuperuser
电子邮件地址直接回车跳过
(前后密码要一致)
如果出现cryptography报错就python终端内安装
pip install cryptography

2.在子应用的admin.py文件中添加代码,注册表,不然admin控制台没办法管理这个表

from django.contrib import admin
#导包
from myapp.models import Teacher,Student  #models.py文件内创建的模型类名
# Register your models here.
admin.site.register(Teacher)
admin.site.register(Student)

3.运行项目,在admin页面添加数据

案例:实现一对一增删改查。

创建两个表
外键绑定,实现增删改查

分析

需要3个页面、需要4个类视图
老师类视图:
展示老师信息
点击老师名字跳转到学生页面
并且是绑定老师的学生
能够进行添加老师跟学生信息
学生类视图:
删除,修改
点击删除删除学生信息
点击修改,跳转到修改页面进行修改

修改类视图:
输入学生的信息进行修改

在根目录文件夹内创建三个html页面文件

这是将三个html文件写在一起了
注意看注释每个文件隔开了

<!--第一个老师页面-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>老师页面</h3>
    <table width="300px" border="1">
        <tr>
            <td>编号</td>
            <td>老师姓名</td>
            <td>所授课程</td>
        </tr>
        {% for i in teachers %}
            <tr>
                <td>{{ i.id }}</td>
                <td><a href="/stu/{{ i.id }}">{{ i.tea_name }}</a></td>
                <td>{{ i.course }}</td>
            </tr>
        {% endfor %}
    </table>
{#  添加老师信息  #}
    <form method="post">
        {% csrf_token %}
        名字:<input type="text" name="name">
        课程:<input type="text" name="course">
        <input type="submit" value="添加">
    </form>
{#  添加学生信息  #}
    <form method="post" action="/creates/">
        {% csrf_token %}
        名字:<input type="text" name="name">
        身高:<input type="text" name="height">
        颜值:<input type="text" name="face">
        授课老师:<input type="text" name="teacher">
        <input type="submit" value="添加">
    </form>
</body>
</html>
<!--第二个学生页面-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>学生页面</h3>
    <table>
        <tr>
            <td>编号</td>
            <td>学生姓名</td>
            <td>身高</td>
            <td>颜值</td>
            <td>授课老师</td>
            <td>操作</td>
        </tr>
        {% for i in students %}
            <tr>
                <td>{{ i.id }}</td>
                <td>{{ i.stu_name }}</td>
                <td>{{ i.height }}</td>
                <td>{{ i.face }}</td>
                <td>{{ i.teacher }}</td>
                <td><a href="/del/{{ i.id }}">删除</a>
                    <a href="/update/{{ i.id}}/">修改</a>
                </td>

            </tr>
        {% endfor %}

    </table>
</body>
</html>
<!--第三个修改页面-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>修改页面</h3>
    <form method="post">
        {% csrf_token %}
        姓名<input type="text" name="name" value="{{ student.stu_name }}">
        身高<input type="text" name="height" value="{{ student.height }}">
        颜值<input type="text" name="face" value="{{ student.face }}">
        老师编号<input type="text" name="teacher" value="{{ student.teacher_id }}">
        <input type="submit" value="修改">
    </form>
</body>
</html>

在views.py文件内创建视图类

from django.shortcuts import render,redirect
from django.views import View
from myapp.models import Teacher,Student
from django.http import HttpResponse
# Create your views here.
#获取老师数据 传值到老师页面
#在老师页面进行添加信息
class Teacherview(View):
    def get(self,request):
        teachers=Teacher.objects.all()
        return render(request,'teachers.html',{'teachers':teachers})
	    def post(self,request):
        #添加老师信息
        name1=request.POST.get('name')
        course1=request.POST.get('course')
        try:
            Teacher.objects.create(
                tea_name=name1,
                course=course1
            )
        except Exception as a:
            print(a)
            return HttpResponse('老师信息添加失败')
        return redirect('/tea/')
# 在老师页面添加学生信息类视图
class createstuview(View):
    def get(self,request):
        return render(request,'teachers.html')
    def post(self,request):
        name1=request.POST.get('name')
        height1=request.POST.get('height')
        face1=request.POST.get('face')
        teacher1=request.POST.get('teacher')
        try:
            Student.objects.create(
                stu_name=name1,
                height=height1,
                face=face1,
                teacher_id=teacher1
            )
        except Exception as a:
            print(a)
            return HttpResponse('学生信息添加失败')
        return redirect('/tea/')

#对应的学生类视图
class Studentview(View):
    def get(self,request,id):
        #id:老师的编号
        #根据老师的编号获取对应学生的信息
        students=Student.objects.filter(teacher_id=id)
        return render(request,'students.html',{'students':students})

#删除学生信息
class Delstudentview(View):
    def get(self,request,id):
        #删除数据并重定向到老师页面
        # Student.objects.filter(id=id).delete()
        # return redirect('/tea/')

        #2.删除数据并重定向到学生页面
        stu_data=Student.objects.get(id=id)
        #获取老师id 用于重定向
        tea_data=stu_data.teacher_id
        stu_data.delete()
        #传值对应老师的id
        return redirect(f'/stu/{tea_data}/')

#根据id修改学生信息
class Updatestudentview(View):
    #获取页面
    def get(self,request,id):
        try:
            stu_data=Student.objects.get(id=id)
        except Exception as e:
            print(e)
            return HttpResponse('要修改的数据不存在')
        return render(request,'index.html',{'student':stu_data})
    #根据id修改学生信息
    def post(self,request,id):
        name1=request.POST.get('name')
        height1=request.POST.get('height')
        face1=request.POST.get('face')
        teacher1=request.POST.get('teacher')
        try:
            Student.objects.filter(id=id).update(
                stu_name=name1,
                height=height1,
                face=face1,
                teacher=teacher1,
            )
        except Exception as e:
            print(e)
            return HttpResponse('修改数据失败')
        return redirect('/tea/')

配置路由

#导包
from myapp import views
urlpatterns = [
    # path('admin/', admin.site.urls),
    #老师页面
    path('tea/',views.Teacherview.as_view()),
    #添加学生信息路由
    path('creates/',views.createstuview.as_view()),
    #学生页面
    path('stu/<int:id>/',views.Studentview.as_view()),
    #删除学生信息
    path('del/<int:id>/',views.Delstudentview.as_view()),
    #修改学生信息
    path('update/<int:id>/',views.Updatestudentview.as_view())
]

2.路由分发

将主路由扽分发到子应用里
先在子应用里创建一个跟主路由同名的urls.py文件
然后将主路由里的文件复制到子应用里的urls.py中

# from django.contrib import admin
from django.urls import path,re_path

from myapp import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    #老师页面
    path('tea/',views.Teacherview.as_view()),
    #学生页面
    path('stu/<int:id>/',views.Studentview.as_view()),
    #删除学生信息
    path('del/<int:id>/',views.Delstudentview.as_view()),
    #修改学生信息
    path('update/<int:id>/',views.Updatestudentview.as_view())
]

在主路由里进行分发

from django.contrib import admin
#导包
from django.urls import path,include
from myapp import urls

#路由分发 全部分到子路由

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(urls))
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值