django_todo

django

介紹

版本:1.x 和 2.x, 2.x不支持python2版本,只支持py3.5及以上版本。1.x路由正則風格 2.x路由風格簡單類似flask。

優點:大而全,封裝多種功能,開箱即用。目錄結構適合中大型程序。缺點,內含的功能有些用不上。

教程

  1. 確認python版本和django版本已安裝。python -m django --version
  2. 新建工程項目
    django-admin startproject mysite
  3. 項目目錄結構
    根目錄下manage.py啓動服務的入口。跟項目同名的mysite文件夾下是主要項目代碼。有的項目中這個文件夾又叫做app、src。settings.py設置,urls.py路由。wsgi.py打包應用部署相關。
  4. 啓動項目 python manage.py runserver
  5. 生成應用 python manage.py startapp polls 。project是項目工程,app應用是項目中一個功能模塊。polls目錄下migrations是sql遷移腳本,admin.py後臺插件,apps.py ,models.py定義表結構的類,
    tests.py單元測試,views.py業務邏輯和HTML渲染。

orm操作

  1. 查詢表中所有數據
    Question.objects.all() 返回model對應table的所有行
  2. 插入數據 默認自動提交。
    q = Question()
    q.save()
  3. 帶條件查詢
    類.objects.filter(列=值,列2=值2)
  4. 模糊匹配 字段後跟表示特殊操作__開頭
    類.objects.filter(字段__startswith=‘匹配子串’)
  5. 查詢除了filter,也可以get,功能一致
    類.objects.get(列=值)
    get查詢不到報異常。(推薦)filter查詢不到返回空結果集。filter返回QuerySet結果集,get返回Question實例。
  6. 類實例相當於表中一行數據,可以調用實例方法
    q = Question.objects.get(id=1)
    q.方法()
  7. 反向查詢
    需求,查詢question表中“下週五考試嗎”這個問題對應的選項,如果是sql,要先select id from question表 where text=“下週”得到qid,再select * from choice where question_id=qid;
    而orm幫我們只需要 q.關聯表_set.all()。
    優點省一條查詢代碼缺點不太好理解。
  8. 一對多關係
    先把一的一方的表的一行數據get出來,
    q = Question.objects.get(id=1)
    然後反向查詢關聯創建q.choice_set.create(choice_text=’’)
  9. 刪除
    q = Question.objects.get(id=1)
    q.delete()

配置

mysite/settings
DATABASE{} , engine 用哪種數據庫, name 數據存儲文件名
其它需要關注的配置:
INSTALLED_APPS django數據庫遷移時會檢查installed apps中的應用涉及到的類,根據類生成sql。如果模塊應用未添加到此配置,那麼模塊下models.py中定義的類不會生成表。
TIME_ZONE USE_TZ 保持默認。
大部分保持默認即可。

遷移migrate數據庫

  1. settings.py INSTALLED_APP 插上應用
  2. python manage.py makemigrations polls 根據模塊下models.py生成遷移腳本
  3. (選做)python manage.py sqlmigration polls 0001 查看sql語句。
  4. python manage.py migrate 執行遷移腳本

##、數據模型(model.py

   在當代 Web 應用中,主觀邏輯經常牽涉到與數據庫的交互。 數據庫驅動網站在後臺連接數據庫服務器,從中取出一些數據,然後在 Web 頁面用漂亮的格式展示這些數據。這個網站也可能會向訪問者提供修改數據庫數據的方法。由於先天具備 Python 簡單而強大的數據庫查詢執行方法,Django 非常適合開發數據庫驅動網站。
   Django 的設計鼓勵鬆耦合及對應用程序中不同部分的嚴格分割。 遵循這個理念的話,要想修改應用的某部分而不影響其它部分就比較容易了。把數據存取邏輯、業務邏輯和表現邏輯組合在一起的概念有時被稱爲軟件架構的 Model-View-Controller(MVC)模式。 在這個模式中, Model 代表數據存取層,View 代表的是系統中選擇顯示什麼和怎麼顯示的部分,Controller 指的是系統中根據用戶輸入並視需要訪問模型,以決定使用哪個視圖的那部分。
   Django 緊緊地遵循這種 MVC 模式,可以稱得上是一種 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含義:
   M,數據存取部分,由django數據庫層處理。
   V,選擇顯示哪些數據要顯示以及怎樣顯示的部分,由視圖和模板處理。
   C,根據用戶輸入委派視圖的部分,由 Django 框架根據 URLconf 設置,對給定 URL 調用適當的Python 函數。

   由於 C 由框架自行處理,而 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),Django 也被稱爲 MTV 框架 。在 MTV 開發模式中:
   M 代表模型(Model),即數據存取層。 該層處理與數據相關的所有事務: 如何存取、如何驗證有效

性、包含哪些行爲以及數據之間的關係等。

   T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。
   V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋樑。

   在TodoList的案例中,我們的數據模型主要包含一下的一些字段:用戶名、todo內容、是否完成的標誌位、優先級、發佈時間。我們使用python代碼來描述這些字段,如下圖所示:

在這裏插入圖片描述

   每個數據模型都是 django.db.models.Model 的子類。它的父類 Model 包含了所有必要的和數據庫交互的方法,並提供了一個簡潔漂亮的定義數據庫字段的語法。每個模型相當於單個數據庫表,每個屬性也是這個表中的一個字段。屬性名就是字段名,它的類型(例如CharField )相當於數據庫的字段類型 (例如 varchar )。我們並沒有顯式地爲這些模型定義任何主鍵。 除非你單獨指明,否則Django會自動爲每個模型生成一個自增長的整數主鍵字段每個Django模型都要求有單獨的主鍵id。

   輸入“python manage.py sqlall SimpleTodo”命令,我們可以看到生成的SQL語句:



   按約定,Django添加 "_id" 後綴到外鍵字段名,用 REFERENCES 語句明確定義。在這個表中,user是外鍵,引用Django的內置權限控制系統,使用“from django.contrib.auth.models import User”引入。

   __unicode__() 方法告訴Python如何將對象以unicode的方式顯示出來。內嵌類 "class Meta" 給你的 model 定義元數據,用於定義一些Django模型類的行爲特性。比如ordering定義默認排序字段及排序方式, 用於得到一個對象列表的任何場合。

二、站點管理(admin.py
Django自動管理工具是django.contrib的一部分。django.contrib是一套龐大的功能集,它是Django基本代碼的組成部分,Django框架就是由衆多包含附加組件(add-on)的基本代碼構成的。 你可以把django.contrib看作是可選的Python標準庫或普遍模式的實際實現。 它們與Django捆綁在一起,這樣你在開發中就不用“重複發明輪子”了。管理工具是django.contrib的一個部分。從技術層面上講,它被稱作django.contrib.admin。django.contrib中其它可用的特性,如用戶鑑別系統(django.contrib.auth)、支持匿名會話(django.contrib.sessioins)以及用戶評註系統(django.contrib.comments)。

  基本的admin功能就不詳述了,主要看一下我們的models是如何加入到Admin管理功能中的。在app的admin.py文件中,代碼如下:

在這裏插入圖片描述

  admin.site.register()函數將我們之前定義的數據庫表放到管理界面中,第一個參數就是之前定義的數據庫模型,第二個參數是我們對顯示字段的自定義顯示方式,如果沒有第二個參數則默認使用對象中的__unicode__()方法進行顯示:

  list_display:一個字段名稱的元組,用於列表顯示,這些字段名稱必須是模塊中有的。

  list_filter:這個字段元組創建過濾器,它位於列表頁面的右邊。Django爲日期型字段提供了快捷過濾方式,它包含:今天、過往七天、當月和今年。這些是開發人員經常用到的。、

  ordering:字段的排序方式,加上負號代表降序排列。

  通過下面兩張圖,我們可以明顯看出來加入自定義函數後的效果(後者):

在這裏插入圖片描述

在這裏插入圖片描述

三、視圖(views.py
一個視圖就是Python的一個函數。這個函數第一個參數的類型是HttpRequest;它返回一個HttpResponse實例。爲了使一個Python的函數成爲一個Django可識別的視圖,它必須滿足這兩個條件。本例中的view.py如下:

在這裏插入圖片描述

在這裏插入圖片描述

  一旦創建了模型,Django自動爲這些模型提供了高級的Python API,可以讓我們很方便的操作數據庫。例如在第一個函數todolist中:

   使用`` Todo.objects`` 屬性從數據庫取出todo的信息,這個屬性可以認爲是包含todo的記錄集,也就是我們的todolist。filter()是數據過濾方法,這裏我們只取還沒有完成的todolist(flag=1),已經完成的finishtodos採用同樣的方法獲取。最後通過模板把我們找到的數據顯示出來,具體怎麼漂亮的顯示,那就是模板的工作了。

   在todofinish函數中,我們使用到了get()方法,通過id來獲取單個對象(filter() 函數返回一個記錄集)。使用HttpResponseRedirect對象將網頁重定向至一個顯示頁面。否則,更新數據後再重新顯示出來。

   當用戶添加一個新的todo對象的時候,就要調用addtodo()函數了。POST數據是來自HTML中的〈form〉標籤提交的,通過提交的數據,分別填充todo的各字段,然後調用模板顯示。

四、URL配置
URLconf 就像是 Django 所支撐網站的目錄。 它的本質是 URL 模式以及要爲該 URL 模式調用的視圖函數之間的映射表。你就是以這種方式告訴 Django,對於這個 URL 調用這段代碼,對於那個URL 調用那段代碼。
這裏我們使用了兩個urls.py文件,分別放在項目和應用當中,這樣清晰明瞭而且更具備移植性。需要注意到的就是在類似’^todofinish/(?P\d+)/$‘這樣的表達式功能是匹配數字賦值給id並且作爲後面函數的第二個參數。name參數的作用就是當你在template中寫有{% url uploadify_script %}的時候能夠直接找到url(’^uploadify_script’, ‘index’, name = ‘uploadify_script’),來執行程序,也就是執行views.py中的index函數。

五、模板
模板分爲三個文件:simpleTodo.html,showtodo.html,updatatodo.html。具體代碼就不貼出來了,可以直接從源碼中查看。本人對html之類的沒有多少開發經驗,bootstrap、javascript,ajax之類的就更搞不明白了。不過對照模板中的代碼,遇到不會的就上網查一下,還是可以看明白的,下面是我在學習過程中參考的一些網站:

1、Bootstrap 教程:http://www.w3cschool.cc/bootstrap/bootstrap-tutorial.html
2、Ajax教程:http://www.w3cschool.cc/ajax/ajax-tutorial.html
3、HTML5教程:http://www.w3cschool.cc/html/html5-intro.html

六、實現效果
1、首頁

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章