django6 多表应用

settings数据库等修改

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangostudent',  # 数据库名字
        'USER': 'root',  # 账号
        'PASSWORD': 'root',  # 密码
        'HOST': 'localhost',  # IP
        'PORT': '3306',  # 端口
    }
}

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False
 

建表

(1)建学生表,学生详情表,学院表,课程表

from django.db import models

# Create your models here.
class Student(models.Model):
    name = models.CharField(verbose_name='姓名',max_length=30,null=False)
    age = models.SmallIntegerField(verbose_name='年龄',null=True)
    sex = models.SmallIntegerField(default=1)
    phone = models.CharField(max_length=30,default='')
    QQ = models.CharField(default='', max_length=30)
    c_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
    e_time = models.DateTimeField(verbose_name='修改时间',auto_now=True)
    grade = models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True,related_name='grade')
    def __str__(self):
        return self.name
class Grade(models.Model):
    name = models.CharField(verbose_name='班级名称',max_length=30)
    year = models.CharField(verbose_name='学年',max_length=30)
    def __str__(self):
        return self.name
class StudentDetail(models.Model):
    student = models.OneToOneField('Student',on_delete=models.CASCADE,related_name='studentdetail')
    card_num = models.CharField(verbose_name='学生证号码',max_length=30)
    college = models.CharField(verbose_name='学院名称',max_length=30,default='学院信息不详')
class Course(models.Model):
    name = models.CharField(verbose_name='课程名称',max_length=30)
    student = models.ManyToManyField('Student',related_name='student',through='Enroll')
    def __str__(self):
        return self.name
class Enroll(models.Model):
    student = models.ForeignKey('Student',on_delete=models.CASCADE)
    course = models.ForeignKey('Course',on_delete=models.CASCADE)
    c_time = models.DateTimeField(auto_now_add=True)
    paid = models.FloatField(verbose_name='付款',default=0)

(2)注册迁移

from django.contrib import admin
from sapp import models
# Register your models here.

admin.site.register(models.Student)
admin.site.register(models.Course)
admin.site.register(models.Grade)
admin.site.register(models.StudentDetail)
admin.site.register(models.Enroll)

执行makegrations和migrate

配置url

from django.contrib import admin
from django.urls import path,re_path
from sapp import views

urlpatterns = [
    path('studentinfo/', views.stu_info, name='stu_info'),
    path('showstudentinfo/', views.stu_info, name='stu_show_info'),
    path('courseinfo/', views.course_info, name='course_info'),
    path('showcourseinfo/', views.course_info, name='course_show_info'),
    path('enrollinfo/', views.enroll_info, name='enroll_info'),
    path('gradeinfo/', views.grade_info, name='grade_info'),
]

新建forms.py 文件,

一个表创建一个类,继承ModelForm

类中新建Meta类,指定模型和其它信息

from django import forms
from sapp.models import Student,StudentDetail,Course,Enroll,Grade
class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        exclude =['e_time']
class StudentDetailForm(forms.ModelForm):
    class Meta:
        model = StudentDetail
        exclude = ['student']

class CourseForm(forms.ModelForm):
    class Meta:
        model = Course
        exclude = ['student']
class EnrollForm(forms.ModelForm):
    class Meta:
        model = Enroll
        exclude = []
class GradeForm(forms.ModelForm):
    class Meta:
        model = Grade
        exclude = []

views处理逻辑

from django.urls import reverse

from sapp.forms import StudentForm, StudentDetailForm,CourseForm,EnrollForm,GradeForm
from django.shortcuts import render,redirect

def stu_info(request):
    section = '添加学生信息'
    if request.method == "GET":#返回ModelForm
        stu_info_from = StudentForm()
        stu_d_info_from = StudentDetailForm()
        context={
            'stuform': stu_info_from,
            'section': section,
            'studform': stu_d_info_from,
        }
        return render(request, 'studentinfo/addstudent.html', context=context)
    if request.method == "POST":#处理提交的信息
        stu_info_from = StudentForm(request.POST)
        stu_d_info_from = StudentDetailForm(request.POST)#处理onetoone关系
        if stu_info_from.is_valid() and stu_d_info_from.is_valid():
            stu_d_info = stu_d_info_from.save(commit=False)  #
            stu_info = stu_info_from.save() # 真保存,已保存到数据库
            stu_info.studentdetail = stu_d_info# 添加关系
            stu_d_info.save() #真保存stu_d_info
            redirect(reverse('stu_show_info'))
            return render(request, 'studentinfo/addshow.html', context={
            'stuformadd': stu_info,
            'section': section,
            'studformadd': stu_d_info,
        })
def course_info(request):
    section = '添加课程信息'
    if request.method == "GET":
        course_info_from = CourseForm()
        context={
            'stuform': course_info_from,
            'section': section,
        }
        return render(request, 'studentinfo/addcourse.html', context=context)
    if request.method == "POST":
        course_info_from = CourseForm(request.POST)#处理manytomany关系
        if course_info_from.is_valid():
            course_info = course_info_from.save() # 真保存,已保存到数据库
            redirect(reverse('course_show_info'))
            return render(request, 'studentinfo/addcshow.html', context={
            'couseformadd': course_info,
            'section': section,
        })
def enroll_info(request):
    section = '为学生添加课程'
    if request.method == "GET":
        enroll_info_from = EnrollForm()
        context={
            'stuform': enroll_info_from,
            'section': section,
        }
        return render(request, 'studentinfo/addenroll.html', context=context)
    if request.method == "POST":
        enroll_info_from = EnrollForm(request.POST)
        if enroll_info_from.is_valid():
            enroll_info = enroll_info_from.save()
            redirect(reverse('enroll_info'))
            return render(request, 'studentinfo/addeshow.html', context={
            'enrollformadd': enroll_info,
            'section': section,
        })
def grade_info(request):
    section = '添加课程信息'
    if request.method == "GET":
        grade_info_from = GradeForm()
        context={
            'stuform': grade_info_from,
            'section': section,
        }
        return render(request, 'studentinfo/addgrade.html', context=context)
    if request.method == "POST":
        grade_info_from = GradeForm(request.POST)
        if grade_info_from.is_valid():
            grade_info = grade_info_from.save() # 真保存,已保存到数据库
            redirect(reverse('grade_info'))
            return render(request, 'studentinfo/addgshow.html', context={
            'couseformadd': grade_info,
            'section': section,
        })

效果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-08-14 19:14  inhocho  阅读(16)  评论(0)    收藏  举报