您好,登錄后才能下訂單哦!
《Django Web開發(fā)指南》的實例講的差不多了,除了今天要介紹的LiveBlog,還有一個Pastebin。這樣,書中的實例基本講完了。做完這些實例之后,舍得建議回頭看看這本書,或許你會從書中找到舍得所講的實例里忽略掉的一些細節(jié)。此外,《Django Web開發(fā)指南》中有幾個章節(jié)是關(guān)于Django的基礎(chǔ)或高級技術(shù)的,建議閱讀并設(shè)法把它應(yīng)用到你所練習(xí)過的實例中。
正如你已經(jīng)看到的,Django提供了豐富的內(nèi)置功能,你可以很輕松地用這些功能來完成很多工作。但和所有的工具一樣,Django也不是萬能的,它缺乏的最明顯的一個Web功能就是沒有集成Ajax,即異步JavaScript和XML。
在這個實例中,我們要展示一個相對簡單的Ajax應(yīng)用,即“l(fā)iveblog"。liveblog是一個列出了一系列簡短的,帶時間戳的條目的網(wǎng)頁,它能進行自動更新,而無須你去刷新頁面。
1.創(chuàng)建項目和應(yīng)用
我們先來創(chuàng)建本實例的項目,在dos命令提示符下轉(zhuǎn)到Scripts文件夾(如“c:\python32\Scripts”),然后運行如下命令:
$ django-admin startproject liveproject
然后在dos命令提示符下繼續(xù)輸入如下命令,進入項目文件夾:
cd liveproject
接下來開始創(chuàng)建應(yīng)用,在dos命令提示符下輸入命令:
$ python manage.py startapp liveblog
命令執(zhí)行完后,項目根文件夾下會出現(xiàn)一個叫l(wèi)iveblog的文件夾,應(yīng)用創(chuàng)建完畢。
2.建立模型
編輯liveblog/models.py文件,改成下面這樣:
liveblog/models.py:
from django.db import models import datetime class Update(models.Model): timestamp = models.DateTimeField(default=datetime.datetime.now) text = models.TextField() class Meta: ordering = ['-id'] def __str__(self): return "[%s] %s" % ( self.timestamp.strftime("%Y-%m-%d %H:%M:%S"), self.text )
首先修改liveproject/settings.py這個文件,找到INSTALLED_APPS這段設(shè)置,把它改成下面這個樣子:
liveproject/settings.py:
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'liveblog', )
編輯settings.py的時候,建議順便修改一下語言和時區(qū)的設(shè)置,具體的方法請參考:《實戰(zhàn)Django:官方實例Part1》
此外,找到文件中的:
USE_TZ = True
把它改為:
USE_TZ = False
然后在dos命令提示符下運行如下命令:
$ python manage.py makemigrations liveblog
繼續(xù)在dos命令提示符下運行命令:
$ python manage.py migrate
這樣,數(shù)據(jù)庫就建好了。
4.創(chuàng)建管理員賬號在dos命令提示符下運行如下命令:
$ python manage.py createsuperuser
然后依次輸入admin,你的郵箱,輸入兩次密碼,完成創(chuàng)建管理員的操作。
5.在管理界面注冊應(yīng)用編輯liveblog/admin.py 文件,讓它變成下面這個樣子:
liveblog/admin.py:
from django.contrib import admin from liveblog.models import Update admin.site.register(Update)
6.啟動服務(wù)器
在dos命令提示符下運行如下命令:
$ python manage.py runserver
http://127.0.0.1:8000/admin/
然后輸入你剛才創(chuàng)建的管理員賬號和密碼,登錄管理界面,你會看到下面這樣的畫面:
7.添加內(nèi)容
點擊Updates后面的“增加”按鈕,然后在”增加update“頁面的Text文本框中輸入些內(nèi)容,比如”我的第一條消息“:
輸入完畢后點擊”保存“按鈕。
8.編寫視圖接下來我們開始編寫視圖,編輯liveblog/views.py 文件,添加下面的內(nèi)容:
liveblog/views.py:
from django.views import generic from liveblog.models import Update class IndexView(generic.ListView): template_name = 'liveblog/update_list.html' def get_queryset(self): return Update.objects.all()
我們只寫了一個簡單的首頁視圖,這個視圖中的get_queryset方法甚至可以去掉,直接加入model=Update,也能實現(xiàn)同樣的效果。
9.編寫模板
首先創(chuàng)建模板文件夾,在liveblog文件夾下建立templates文件夾,然后在templates下再建一個liveblog文件夾。
隨后我們在這個文件夾下建立update_list.html文件,這個update_list.html文件的正確路徑應(yīng)該是:
liveblog/templates/liveblog/update_list.html
編輯update_list.html文件,加入如下內(nèi)容:
liveblog/templates/liveblog/update_list.html:
<html> <head> <title>Liveblog</title> <style type="text/css"> div.update {padding: 8 1.5em; } div.even { background: #ddd; } div.timestamp { float: left; font-weight: bold; } div.text { float: left; padding-left: 10px; } div.clear { clear: both; height: 1px; } body { padding: 0 2em; font-family: Microsoft Yahei,sans-serif; background: #fff; } h2 { background: #1E2933; padding: 15 0.8em; margin: 0; color:#fefefe; } p { background: #3776AB; padding: 15 2em; margin: 0; color:#fefefe; font-size:12px; } </style> </head> <body> <h2>Liveblog</h2> <p>本頁面會每隔15秒自動更新一次——請<b>不要</b> 手動刷新頁面!</p> {% if object_list %} <div id="update-holder"> {% for object in object_list %} <div class="update {% cycle even,odd %}" id="` object`.`id `"> <div class="timestamp"> {{ object.timestamp|date:"Y-m-d H:i:s" }} </div> <div class="text"> {{ object.text|linebreaksbr }} </div> <div class="clear"></div> </div> {% endfor %} </div> {% else %} <p>暫無更新 - 請稍后重試!</p> {% endif %} </body> </html>
10.設(shè)計URL
在liveblog文件夾下創(chuàng)建一個叫url.py的文件,然后添加如下內(nèi)容:
liveblog/urls.py :
from django.conf.urls import patterns, include, url from liveblog import views urlpatterns = patterns('', url(r'^$', views.IndexView.as_view(), name='index'), )
編輯liveproject/urls.py 文件,讓它變成下面這樣:
liveproject/urls.py :
from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^live/', include('liveblog.urls')), )
我們來看一下首頁,訪問http://127.0.0.1:8000/live/:
現(xiàn)在,應(yīng)用看上去已經(jīng)做好了——但是,說好的”ajax”呢?我們接下來給頁面加入Ajax功能,讓它能幫助我們實現(xiàn)自動更新。
11.加入Ajax
實際上來說,網(wǎng)站“實現(xiàn)Ajax”主要包含了以下三個主要任務(wù)。
首先我們得先下載一個Ajax庫,我們選擇了當(dāng)下比較流行的Jquery庫,這是官方的下載地址:http://code.jquery.com/jquery-2.1.1.min.js,你也可以呆會直接下載我們的源代碼包,那里已經(jīng)給你準備好了這個文件。
下載好jquery后,在項目根文件夾下建立一個media文件夾,然后再在其下建立一個js文件夾,將jquery-2.1.1.min.js文件放到j(luò)s文件夾下,這樣,文件夾的結(jié)構(gòu)會是下面這個樣子:
liveproject/ manage.py liveproject/ liveblog/ media/ js/ jquery-2.1.1.min.js
接下來我們要修改模板,把下面的代碼加入到”</style>“和”</head>”之間:
liveblog/templates/liveblog/update_list.html:
<script type="text/javascript" language="javascript" src="/media/js/jquery-2.1.1.min.js"></script> <script type="text/javascript" language="javascript"> function update() { update_holder = $("#update-holder"); most_recent = update_holder.find("div:first"); $.getJSON("updates-after/" + most_recent.attr('id') + "/", function(data) { cycle_class = most_recent.hasClass("odd") ? "even" : "odd"; jQuery.each(data, function() { update_holder.prepend('<div id="' + this.pk + '" class="update "' + cycle_class + '"><div class="timestamp">' + this.fields.timestamp.replace('T',' ') + '
然后我們編輯liveblog/views.py 文件,讓它變成下面這樣:
liveblog/views.py:
from django.http import HttpResponse from django.core import serializers from django.views import generic from liveblog.models import Update def updates_after(request, id): response = HttpResponse() response['Content-Type'] = "text/javascript" response.write(serializers.serialize("json", Update.objects.filter(pk__gt=id))) return response class IndexView(generic.ListView): template_name = 'liveblog/update_list.html' def get_queryset(self): return Update.objects.all()
這里我們利用了Django內(nèi)置的序列化庫,把模型對象轉(zhuǎn)換成json格式,再把它寫到HttpRespose里去。最后,要讓JavaScript能正確解析和使用響應(yīng)的正文,還需要在響應(yīng)里設(shè)置Content-Type頭。
最后需要修改URL模式,編輯liveblog/urls.py 文件,讓它變成下面這樣:
liveblog/urls.py :
from django.conf.urls import patterns, include, url from liveblog import views urlpatterns = patterns('', url(r'^$', views.IndexView.as_view(), name='index'), url(r'^updates-after/(?P<id>\d+)/$', views.updates_after, name='updates_after'), )
編輯liveproject/urls.py 文件,讓它變成下面這樣:
liveproject/urls.py :
from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^live/', include('liveblog.urls')), url(r'^(?P<path>.*)', 'django.views.static.serve'), )
做完上述工作后,我們可以去測試一下,先刷新一下瀏覽器,然后到后臺新增一個update,比如叫”我的第二條消息“,回到首頁(http://127.0.0.1/live/),不要刷新頁面,觀察新添加的內(nèi)容有無被自動刷新。
附:本實例源代碼下載地址:舍得學(xué)苑下載中心
【The End】
本文版權(quán)歸舍得學(xué)苑所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者和出處。謝謝!
作者:舍得
首發(fā):舍得學(xué)苑@博客園
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。