揣著Django做項目

引言

大家好我是初學Django的菜鳥bllli,在知乎記錄一下我通過Django完成創新項目《翻轉課堂》網站的一些經歷。

本文試圖帶領大家從一個項目的「想法」開始,在開發過程中一步步完善需求。

首先介紹一下項目背景,這個是我校的創新項目,按老師給的題目和需求來製作一個軟體。我拿到的項目就是翻轉課堂了,全名叫《基於「創課」的高校翻轉課堂教學平台》。

因為距離項目開始已經有一段時間了,讓我從最開始部署環境、createapp啥的開始講起是不可能的, 我想給大家分享的是我從拿到這個項目開始的思考,和對某些情況的處理辦法。 代碼都放在我的Github上。 我是初學者,會有一些處理或是表述的不太好的地方,還請各位朋友多多指點,謝謝!

書歸正傳,老師給出的東西畫風是這樣的

創課的內容與活動設計多圍繞複雜的現實問題展開,鼓勵學生結合興趣組成項目小組,在指導教師團隊的集體指導下開展協作探究。學生通過不斷的動手設計、製作、修改與完善等,最終將創意變成現實的產品、方案與服務。培養了學生的協作學習能力和實踐能力。

兩個字,精闢!但僅靠這些外加腦補肯定弄不清楚項目的需求,瞎做一通不是老師想要的效果還得回爐重做。於是繼續跟老師溝通。

要求

說實話我看到整理出這麼多東西我頭都大了,根本沒見過這架勢好伐?

右側加粗的是我的內心os

  • 一個網站 (沒錯,一個網站,B/S結構)
  • 註冊/登錄/學生認證/教師認證 (註冊、身份認證啥的不用急用django admin加幾個小號就行了,先把登錄做出來再說。)
  • 學生能夠自由結組 (小嶽嶽_我的天吶.jpg 這可咋整)
  • 教師能夠提交「課題」(課題頁面中,教師能夠發布多篇文章、資料) (這個好說,課題和文章是一對多關係,把屬於同個課題的文檔全查出來就行)
  • 教師能夠設定「課題」的某個階段的截止日期 (停停停 腦殼痛 我先弄出前面的)
  • 學生結組後,能夠提交各個階段的成果文章。
  • 未提交的小組應收到(站內信/郵件)提示。
  • 教師可以在課程後台界面看到各組提交成果狀況,並進行評價/打分/要求修改。

說實話要是詳細展開了研究,得研究好長時間,現在這個太缺細節。那咱們邊寫邊分析吧。

資料庫設計

常言道兵馬未動糧草先行,咱們邊設計資料庫邊去想怎麼實現功能。

下面的ER圖是已經完成的資料庫的模型,待會兒分析的時候可以回來看看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

歡迎前來學習/指導!

推薦閱讀:

TAG:Python | Django框架 |