原文地址html
在兩篇文章幫你入門Django(上)一文中,咱們已經作了一個簡單的小網站,實現了保存用戶數據到數據庫,以及從後臺數據庫讀取數據顯示到網頁上這兩個功能。python
看上去沒有什麼問題了,不過咱們可讓它變得更加完美,好比說爲它添加一個簡單的後臺,用來管理咱們的Question數據庫,或者是寫點測試單元來看看咱們的程序有沒有什麼Bug。git
首先須要添加後臺管理員帳號,只須要簡單的 createsuperuser
命令,以下:程序員
$ python manage.py createsuperuser Username (leave blank to use 'feizhao'): happy Email address: Password: Password (again): Superuser created successfully.
<!-- more -->github
而後就能夠經過 http://127.0.0.1:8000/admin/ 進入管理員登陸頁面。咱們用剛纔建立的管理員帳號登陸成功後就會看到Groups
和Users
兩個能夠編輯的內容,它們是Django內置的認證模塊django.contrib.auth
提供的數據庫,進入Users就會看到剛剛建立的管理員用戶happy了。web
目先後臺還看不到咱們的Question數據庫,由於還沒告訴後臺它的存在。咱們能夠在questions應用下的admin.py
文件裏面註冊該數據庫的存在,註冊的語句很是簡單,以下:shell
from django.contrib import admin from questions.models import Question admin.site.register(Question)
這樣咱們刷新後臺以後,就能看到Question數據庫了,以下圖:數據庫
進入Question數據庫後,咱們會看到每一條記錄,不過這裏顯示的結果多是這樣子:django
這是由於默認狀況下,每條記錄顯示的是str()
返回的內容,而咱們沒有在class Question(models.Model)
中覆蓋該方法。不過咱們能夠在這裏指定數據庫記錄顯示某個字段,方法也特別簡單,修改admin.py以下:app
class QuestionAdmin(admin.ModelAdmin): list_display = ('context',) admin.site.register(Question, QuestionAdmin)
這樣每條記錄顯示的就是context內容了,咱們進去某條記錄後,會看到全部的字段,而且能夠進行更新、刪除、添加等操做。Django後臺的可定製性仍是很是高的,咱們能夠按照本身愛好打造屬於本身的後臺。
Django另外一個比較不錯的地方就是提供了完整的自動化測試機制,方便開發人員進行測試。仍然以咱們前面的questions這個應用爲例,咱們會發如今問題描述框沒有輸入任何內容時點擊提交,仍然會跳轉到添加成功頁面,也就是說咱們添加了一個空的問題,這固然不是咱們想要的,咱們能夠寫一個程序來測試咱們的添加問題的功能。
Django中,實現測試很是簡單,咱們能夠在questions應用中新建tests.py
文件,在裏面寫好測試邏輯,而後用django的測試系統完成測試。下面即爲咱們的測試程序questions/tests.py:
from django.test import TestCase from django.test import Client class QuestionMethodTests(TestCase): def test_add(self): client = Client() response = client.post('/add_done/', {'content': ""}) self.assertNotEqual(response.status_code, 200)
咱們模擬了一個客戶端client,將空字符串傳給content字段,而後發起一個post請求到/add_done/
頁面(默認狀況下測試時並不檢查CSRF字段),而後斷言post請求不成功(也就是返回包的狀態碼不爲200)。下面運行測試程序:
$ python manage.py test questions Creating test database for alias 'default'... F ====================================================================== FAIL: test_add (questions.tests.QuestionMethodTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/feizhao/Documents/python_demo/mysite/questions/tests.py", line 10, in test_add self.assertNotEqual(response.status_code, 200) AssertionError: 200 == 200 ---------------------------------------------------------------------- Ran 1 test in 0.009s FAILED (failures=1) Destroying test database for alias 'default'...
測試沒經過,說明確實插入了空白問題。注意測試時並不須要運行web服務,這樣能節省HTTP服務的開銷,提升測試的速度。如今對views中的add_done稍做改動,以下:
def add_done(request): content = request.POST['content'] if content != "": add_question = Question() add_question.context = content add_question.save() return render( request, "questions/add_done.html", {'question': content}, ) else: return redirect("/add/")
首先檢查字符串是否爲空,爲空的話重定向頁面到/add/
,不爲空則添加問題成功。再次運行測試程序,則經過測試,結果以下:
$ python manage.py test questions Creating test database for alias 'default'... . ---------------------------------------------------------------------- Ran 1 test in 0.007s OK Destroying test database for alias 'default'...
其實這個應用還有bug就是一個問題可能重複提交屢次,這裏不詳細闡述。
有時候咱們想驗證下某條語句是否符合預期,或者是輸出某個變量觀察一下值,這時候直接在項目裏實現可能會很是麻煩。這種狀況可使用python解釋器的交互模式,爲了不手動導入django的配置環境,能夠運行 python manage.py shell
,而後就可使用django的API,而且在當前項目目錄進行交互,以下例:
$ python manage.py shell Python 2.7.5 (default, Mar 9 2014, 22:15:05) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole)
from questions.models import Question
null_question = Question()
null_question.save()
for question in Question.objects.all():... print question.context ... as as 程序員爲何最帥 程序爲何老出bug
交互模式使用起來可能事半功倍,因此不要忘了哦。
好了,前面就是django的一些重要的特色了,下面來看看有哪些資源能夠幫咱們更好地學習django。
Django中國社區是國內的Django開發社區,人氣不是很旺,不過也能在裏面找到有用的東西。好比@evilbinary在這裏一個博客,兼容wp,代碼高亮功能支持 提供了一個用Django搭建的博客,並給出了源碼,咱們能夠學習。還有一些不錯的Django開源項目,好比這個小的BBS論壇fairybbs,還有這個登陸的應用django-siteuser。
中文的教程目前有djangobook 2.0,可是書中使用的Django版本過低,所以不推薦使用。英文的資料仍是挺豐富,不過仍是推薦讀文檔,雖然文檔有時候特別坑人(被坑了好屢次)。
此外,除了Stackoverflow(這個太喜歡了,誰用誰知道,不用擔憂英語太爛,放代碼和錯誤提示,實在不行用Google翻譯加一點描述就行。總而言之,SO就是程序員的天堂啊), Segmentfault這些問答網站,不少Django用戶在郵件列表(郵件列表是groups.google.com
,因此你懂的)裏提問題、回答問題,這裏的氛圍很是不錯,各類問題都有人來幫你。好比這種中二的問題Serving static files and media in Django 1.7.1也是有人十分認真的做答的。因此,不要害羞,有問題大膽問吧。
若是你決定好好玩Django了,那麼先看一下Django FAQ,可能會解決關於Django的一些疑問。