兩篇文章幫你入門Django(下)

原文地址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/ 進入管理員登陸頁面。咱們用剛纔建立的管理員帳號登陸成功後就會看到GroupsUsers兩個能夠編輯的內容,它們是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數據庫

進入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的一些疑問。

相關文章
相關標籤/搜索