揣著Django做項目
引言
大家好我是初學Django的菜鳥bllli,在知乎記錄一下我通過Django完成創新項目《翻轉課堂》網站的一些經歷。
本文試圖帶領大家從一個項目的「想法」開始,在開發過程中一步步完善需求。
首先介紹一下項目背景,這個是我校的創新項目,按老師給的題目和需求來製作一個軟體。我拿到的項目就是翻轉課堂了,全名叫《基於「創課」的高校翻轉課堂教學平台》。
因為距離項目開始已經有一段時間了,讓我從最開始部署環境、createapp啥的開始講起是不可能的, 我想給大家分享的是我從拿到這個項目開始的思考,和對某些情況的處理辦法。 代碼都放在我的Github上。 我是初學者,會有一些處理或是表述的不太好的地方,還請各位朋友多多指點,謝謝!
書歸正傳,老師給出的東西畫風是這樣的
創課的內容與活動設計多圍繞複雜的現實問題展開,鼓勵學生結合興趣組成項目小組,在指導教師團隊的集體指導下開展協作探究。學生通過不斷的動手設計、製作、修改與完善等,最終將創意變成現實的產品、方案與服務。培養了學生的協作學習能力和實踐能力。
兩個字,精闢!但僅靠這些外加腦補肯定弄不清楚項目的需求,瞎做一通不是老師想要的效果還得回爐重做。於是繼續跟老師溝通。
要求
說實話我看到整理出這麼多東西我頭都大了,根本沒見過這架勢好伐?
右側加粗的是我的內心os
- 一個網站 (沒錯,一個網站,B/S結構)
- 註冊/登錄/學生認證/教師認證 (註冊、身份認證啥的不用急用django admin加幾個小號就行了,先把登錄做出來再說。)
- 學生能夠自由結組 (小嶽嶽_我的天吶.jpg 這可咋整)
- 教師能夠提交「課題」(課題頁面中,教師能夠發布多篇文章、資料) (這個好說,課題和文章是一對多關係,把屬於同個課題的文檔全查出來就行)
- 教師能夠設定「課題」的某個階段的截止日期 (停停停 腦殼痛 我先弄出前面的)
- 學生結組後,能夠提交各個階段的成果文章。
- 未提交的小組應收到(站內信/郵件)提示。
- 教師可以在課程後台界面看到各組提交成果狀況,並進行評價/打分/要求修改。
說實話要是詳細展開了研究,得研究好長時間,現在這個太缺細節。那咱們邊寫邊分析吧。
資料庫設計
常言道兵馬未動糧草先行,咱們邊設計資料庫邊去想怎麼實現功能。
下面的ER圖是已經完成的資料庫的模型,待會兒分析的時候可以回來看看ER圖,便於理解。
登錄
托Django的福,登錄不用咱忙活了,看文檔直接用就ok使用Django認證系統
我項目中登錄登出的實現
課程
很簡單嘛!
課程都有哪些屬性?標題、課程介紹、作者(教師)
教師與課程是一對多關係,一個教師可以申請多個課程,而一個課程只能由一名教師負責。一對多關係,在「多」的那邊加個指向「一」的外鍵。教師可以向課程附加多篇文章,作為學習資料。所以先弄文章的model: 文章應該有哪些屬性?標題、作者、內容、創建日期。
作者與文章,一對多關係,在文章里拉一條到User的外鍵;等一下,課程介紹也可以放到文章裡面,統一管理。課程與(作為課程詳情的)文章是一對一的,一個課程只能有一條詳情,一條詳情文章也只能屬於一個課程,所以用了OneToOneField;課程與(教師提交的多條)文章是一對多的,一個課程可以有多條文章,在文章里拉一條到Course的外鍵。(大家看到下面的content_md 和 content_html,我是想用戶輸入md格式文檔,自動轉換為html格式的,時間緊沒來及弄)
from django.db import modelsnfrom django.contrib.auth.models import Usernfrom django.utils.timezone import nownnclass Article(models.Model):n title = models.CharField(max_length=200, verbose_name=文章標題)n content_md = models.TextField(null=True, verbose_name=文章內容)n content_html = models.TextField(null=True)nn author = models.ForeignKey(User, related_name=article_set, verbose_name=文章作者)n belong = models.ForeignKey(Course, related_name=article_set, null=True)nn create_date = models.DateTimeField(default=now)nnnclass Course(models.Model):n title = models.CharField(max_length=200, verbose_name=課程名稱)nn create_date = models.DateTimeField(default=now)nn group_members_min = models.IntegerField(default=1, verbose_name=團隊成員下限)n group_members_max = models.IntegerField(default=20, verbose_name=團隊成員上限)nn detail = models.OneToOneField(Article, null=True, blank=True, verbose_name=課程詳情)n author = models.ForeignKey(User, verbose_name=發布者(教師))n
使用 a_course.detail
獲取課程的「詳情文章」對象
使用 a_course.article_set.all()
獲取課程的「學習資料文章」對象列表
學生自由組建學生團隊
讓學生團隊屬於某個課程,這樣的話就不需要考慮一個小組對應多個課程的引發的各種麻煩事,比如不同課程允許的團隊成員人數上限不同。
學生團隊有啥屬性?團隊名、所屬課程、隊長、隊員。
用戶(隊長)與團隊是一對多關係,一個用戶可以成為多個團隊的隊長。在團隊里添加隊長外鍵;
所屬課程也是一對多;隊員與團隊之間的關係是多對多,一個用戶可以參加多個團隊,一個團隊也可以有多個隊員用戶。使用ManyToManyField學生團隊應該允許成員主動退出隊伍嗎? 課程正式開始前應該允許自由進入退出,但課程進行中就不應該允許了。 於是設一個locked標記,默認為False,課程開始後想個辦法把它設為True,當它為True時禁止退出隊伍。
class CourseGroup(models.Model):n name = models.CharField(max_length=100, verbose_name=小組名稱)nn belong = models.ForeignKey(Course, verbose_name=本組所屬課程)nn creator = models.ForeignKey(User, related_name=my_groups, verbose_name=組長)n members = models.ManyToManyField(User, related_name=added_groups, verbose_name=組員)nn locked = models.BooleanField(default=False, verbose_name=鎖定)n
到現在,課程、文章、團隊model都建好了
功能實現
課程展示
增刪改查,咱們先做查。"增刪改"先交給Django Admin。
展示的話分兩部分,課程列表和課程詳情。
課程列表
課程列表及分頁的實現
課程詳情
課程詳情的實現
自由組隊
想了想,組建流程大概是這樣滴
今天先嘮到這兒
項目託管地址 https://github.com/bllli/ReverseCourse
歡迎前來學習/指導!
推薦閱讀: