-
情景描述:
通過訪問:http://127.0.01:8000/stu/register.html承绸,Demo.jpg
進入學(xué)生選課系統(tǒng),根據(jù)學(xué)生所在班級選擇若干門課程勒庄,
提交選課后串前,收集表單數(shù)據(jù)并存入SQLite3數(shù)據(jù)庫瘫里,
數(shù)據(jù)庫中有三個表,分別為t_student, t_course, t_classroom;
-
構(gòu)建思路:
1.首先要了解Django框架的MVT(Model-View-Template)設(shè)計模式 (推薦三個學(xué)習(xí)鏈接:)
http://morningchen.com/2015/04/08/Django-MVC/
http://python.usyiyi.cn/translate/Django_111/index.html
https://code.ziqiangxuetang.com/django/django-tutorial.html
Django_MVT模式.png
MVT.jpg
MVC.png2.理清三個表的關(guān)系:
學(xué)生信息表 t_student與班級表t_classroom關(guān)系為n:1關(guān)系
學(xué)生信息表 t_student與課程科目表 t_course關(guān)系為n:n關(guān)系
因此酪呻,models.py中三個表對象的創(chuàng)建代碼如下:表關(guān)系.jpg
from django.db import models
# Create your models here.
# 班級類
class Classroom(models.Model):
class_name = models.CharField(max_length=30, unique=True)
class Meta:
db_table = 't_classroom'
def __str__(self):
return 'Classroom:%s' % self.class_name
# 課程類
class Course(models.Model):
course_name = models.CharField(max_length=30, unique=True)
class Meta:
db_table = 't_course'
def __str__(self):
return 'Course:%s' % self.course_name
# 學(xué)生類
class Student(models.Model):
stu_name = models.CharField(max_length=30, unique=True)
# 學(xué)生和班級關(guān)系:一對多减宣, 學(xué)生和課程關(guān)系:多對多
classroom = models.ForeignKey(Classroom)
course = models.ManyToManyField(Course)
class Meta:
db_table = 't_student'
def __str__(self):
return 'Student:%s' % self.stu_name
3.其他注意事項:
- 本Demo中http協(xié)議發(fā)送表單采用的是post請求盐须,為防止403錯誤玩荠,通過將setting.py文件中 MIDDLEWARE 列表的
django.middleware.csrf.CsrfViewMiddleware
語句注釋掉。
1.jpg
- StudentProjectSelectSystem項目下urls.py文件配置如下:
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^stu/', include('student.urls')),
]
- student模塊下urls.py文件配置如下:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^register.html$', views.register_view),
url(r'^addStu', views.addStu_view)
]
- student模塊下models.py完整代碼:
from django.db import models
# Create your models here.
# 班級類
class Classroom(models.Model):
class_name = models.CharField(max_length=30, unique=True)
class Meta:
db_table = 't_classroom'
def __str__(self):
return 'Classroom:%s' % self.class_name
# 課程類
class Course(models.Model):
course_name = models.CharField(max_length=30, unique=True)
class Meta:
db_table = 't_course'
def __str__(self):
return 'Course:%s' % self.course_name
# 學(xué)生類
class Student(models.Model):
stu_name = models.CharField(max_length=30, unique=True)
# 學(xué)生和班級關(guān)系:一對多贼邓, 學(xué)生和課程關(guān)系:多對多
classroom = models.ForeignKey(Classroom)
course = models.ManyToManyField(Course)
class Meta:
db_table = 't_student'
def __str__(self):
return 'Student:%s' % self.stu_name
# 獲取當前班級對象
def __getClassName(class_name):
try:
cls = Classroom.objects.get(class_name=class_name)
except Classroom.DoesNotExist:
cls = Classroom.objects.create(class_name=class_name)
cls.save()
return cls
# 獲取課程對象列表
def __getCourseName(*course_name):
# 聲明一個空列表用于存放課程對象
course_list = []
# 遍歷課程列表
for i in course_name:
try:
course_name_item = Course.objects.get(course_name=i)
except Course.DoesNotExist:
course_name_item = Course.objects.create(course_name=i)
course_name_item.save()
course_list.append(course_name_item)
return course_list
def saveStuInfo(stu_name, class_name, *course_name):
# 獲取當前班級對象
cls = __getClassName(class_name)
# 獲取課程對象列表
course_obj = __getCourseName(*course_name)
# 創(chuàng)建學(xué)生對象
stu = Student(stu_name=stu_name, classroom=cls)
stu.save()
# 將課程對象列表存放在學(xué)生對象中(添加中間表)
stu.course.add(*course_obj)
stu.save()
- student模塊下views.py代碼:
from django.shortcuts import render
from django.http.response import HttpResponse
from . import models
# Create your views here.
def register_view(request):
return render(request, 'register.html')
def addStu_view(request):
# 獲取頁面請求參數(shù)
sname = request.POST.get('sname', '')
clazz = request.POST.get('clazz', '')
cournames = request.POST.getlist('courname', [])
print(sname, clazz, cournames) #測試
print(type(cournames)) # 測試
# 調(diào)用models.py中saveStuInfo方法阶冈,將數(shù)據(jù)保存到數(shù)據(jù)庫中
models.saveStuInfo(sname, clazz, *cournames)
return HttpResponse('選課成功!')
- templates模版下register.html代碼:
( 時間有限塑径,界面寫的比較簡陋女坑,只做初步調(diào)試用,想要豐富樣式可由Bootstrap美化统舀,文檔地址 https://v3.bootcss.com/ )
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ProjectSelectDemo</title>
<style>
div {
margin: 0 auto;
width: 400px;
height: 300px;
background: lightblue;
}
</style>
</head>
<body>
<div>
<h2>歡迎進入選課系統(tǒng)</h2>
<hr/>
<form action="/stu/addStu" method="post">
<table>
<tr>
<td>姓   名:</td>
<td><input type="text" name="sname"/></td>
</tr>
<tr>
<td>班   級:</td>
<td>
<select name="clazz">
<option value="三年級二班">三年二班</option>
<option value="一年級二班">一年級二班</option>
<option value="二年級三班">二年級三班</option>
<option value="四年級五班">四年級五班</option>
</select>
</td>
</tr>
<tr>
<td>可選課程:</td>
<td>
<input type="checkbox" name="courname" value="Html5"/>Html5
<input type="checkbox" name="courname" value="Python"/>Python
<input type="checkbox" name="courname" value="Linux"/>Linux
<input type="checkbox" name="courname" value="Mysql"/>Mysql
</td>
</tr>
<tr>
<td>
<input type="submit" value="提 交"/>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
-
結(jié)果測試:
前端頁面展示:
result1.jpg
result2.jpg后臺數(shù)據(jù)庫展示:
t_student表.jpgt_classroom表.jpgt_course表.jpg中間表.jpg
從以上四張表中可以看出:
- 來自三年級二班的Allen同學(xué)選擇了Html5匆骗、Mysql兩門課程;
- 來自四年級五班的tony同學(xué)選擇了Linux一門課程誉简;
- 來自一年級二班的James同學(xué)選擇了Html5碉就、Mysql、Linux闷串、Python四門課程瓮钥;