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,
})
效果:







浙公网安备 33010602011771号