初學(xué)Django(二):學(xué)生選課系統(tǒng)(1.0.1版)

  • 情景描述:

Demo.jpg
通過訪問:http://127.0.01:8000/stu/register.html承绸,
進入學(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.png

2.理清三個表的關(guān)系:

學(xué)生信息表 t_student與班級表t_classroom關(guān)系為n:1關(guān)系
學(xué)生信息表 t_student與課程科目表 t_course關(guān)系為n:n關(guān)系

表關(guān)系.jpg
因此酪呻,models.py中三個表對象的創(chuàng)建代碼如下:

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>姓&emsp;&ensp;&ensp;名:</td>
                <td><input type="text" name="sname"/></td>
            </tr>
            <tr>
                <td>班&emsp;&ensp;&ensp;級:</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="提&ensp;交"/>
                </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

  • 結(jié)果測試:

  • 前端頁面展示:


    result1.jpg

    result2.jpg
  • 后臺數(shù)據(jù)庫展示:


    t_student表.jpg
    t_classroom表.jpg
    t_course表.jpg
    中間表.jpg

    從以上四張表中可以看出:

  • 來自三年級二班Allen同學(xué)選擇了Html5匆骗、Mysql兩門課程;
  • 來自四年級五班tony同學(xué)選擇了Linux一門課程誉简;
  • 來自一年級二班James同學(xué)選擇了Html5碉就、MysqlLinux闷串、Python四門課程瓮钥;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烹吵,隨后出現(xiàn)的幾起案子碉熄,更是在濱河造成了極大的恐慌,老刑警劉巖肋拔,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈津,死亡現(xiàn)場離奇詭異,居然都是意外死亡凉蜂,警方通過查閱死者的電腦和手機琼梆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跃惫,“玉大人叮叹,你說我怎么就攤上這事”妫” “怎么了蛉顽?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長先较。 經(jīng)常有香客問我携冤,道長悼粮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任曾棕,我火速辦了婚禮扣猫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翘地。我一直安慰自己申尤,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布衙耕。 她就那樣靜靜地躺著昧穿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橙喘。 梳的紋絲不亂的頭發(fā)上时鸵,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音厅瞎,去河邊找鬼饰潜。 笑死,一個胖子當著我的面吹牛和簸,可吹牛的內(nèi)容都是我干的彭雾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼比搭,長吁一口氣:“原來是場噩夢啊……” “哼冠跷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起身诺,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蜜托,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后霉赡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄务,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年穴亏,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜂挪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗓化,死狀恐怖棠涮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刺覆,我是刑警寧澤严肪,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響驳糯,放射性物質(zhì)發(fā)生泄漏篇梭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一酝枢、第九天 我趴在偏房一處隱蔽的房頂上張望恬偷。 院中可真熱鬧,春花似錦帘睦、人聲如沸袍患。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽协怒。三九已至涝焙,卻和暖如春卑笨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仑撞。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工赤兴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隧哮。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓桶良,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沮翔。 傳聞我的和親對象是個殘疾皇子陨帆,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361