《Django Web開(kāi)發(fā)指南》的實(shí)例講的差不多了,除了今天要介紹的LiveBlog,還有一個(gè)Pastebin。這樣,書(shū)中的實(shí)例基本講完了。做完這些實(shí)例之后,舍得建議回頭看看這本書(shū),或許你會(huì)從書(shū)中找到舍得所講的實(shí)例里忽略掉的一些細(xì)節(jié)。此外,《Django Web開(kāi)發(fā)指南》中有幾個(gè)章節(jié)是關(guān)于Django的基礎(chǔ)或高級(jí)技術(shù)的,建議閱讀并設(shè)法把它應(yīng)用到你所練習(xí)過(guò)的實(shí)例中。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了下花園免費(fèi)建站歡迎大家使用!
正如你已經(jīng)看到的,Django提供了豐富的內(nèi)置功能,你可以很輕松地用這些功能來(lái)完成很多工作。但和所有的工具一樣,Django也不是萬(wàn)能的,它缺乏的最明顯的一個(gè)Web功能就是沒(méi)有集成Ajax,即異步JavaScript和XML。
在這個(gè)實(shí)例中,我們要展示一個(gè)相對(duì)簡(jiǎn)單的Ajax應(yīng)用,即“l(fā)iveblog"。liveblog是一個(gè)列出了一系列簡(jiǎn)短的,帶時(shí)間戳的條目的網(wǎng)頁(yè),它能進(jìn)行自動(dòng)更新,而無(wú)須你去刷新頁(yè)面。
1.創(chuàng)建項(xiàng)目和應(yīng)用
我們先來(lái)創(chuàng)建本實(shí)例的項(xiàng)目,在dos命令提示符下轉(zhuǎn)到Scripts文件夾(如“c:\python32\Scripts”),然后運(yùn)行如下命令:
$ django-admin startproject liveproject
然后在dos命令提示符下繼續(xù)輸入如下命令,進(jìn)入項(xiàng)目文件夾:
cd liveproject
接下來(lái)開(kāi)始創(chuàng)建應(yīng)用,在dos命令提示符下輸入命令:
$ python manage.py startapp liveblog
命令執(zhí)行完后,項(xiàng)目根文件夾下會(huì)出現(xiàn)一個(gè)叫l(wèi)iveblog的文件夾,應(yīng)用創(chuàng)建完畢。
2.建立模型
編輯liveblog/models.py文件,改成下面這樣:
liveblog/models.py:
from django.db import modelsimport 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這個(gè)文件,找到INSTALLED_APPS這段設(shè)置,把它改成下面這個(gè)樣子:
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的時(shí)候,建議順便修改一下語(yǔ)言和時(shí)區(qū)的設(shè)置,具體的方法請(qǐng)參考:《實(shí)戰(zhàn)Django:官方實(shí)例Part1》
此外,找到文件中的:
USE_TZ = True
把它改為:
USE_TZ = False
然后在dos命令提示符下運(yùn)行如下命令:
$ python manage.py makemigrations liveblog
繼續(xù)在dos命令提示符下運(yùn)行命令:
$ python manage.py migrate
這樣,數(shù)據(jù)庫(kù)就建好了。
4.創(chuàng)建管理員賬號(hào)在dos命令提示符下運(yùn)行如下命令:
$ python manage.py createsuperuser
然后依次輸入admin,你的郵箱,輸入兩次密碼,完成創(chuàng)建管理員的操作。
5.在管理界面注冊(cè)應(yīng)用編輯liveblog/admin.py 文件,讓它變成下面這個(gè)樣子:
liveblog/admin.py:
from django.contrib import adminfrom liveblog.models import Update admin.site.register(Update)
6.啟動(dòng)服務(wù)器
在dos命令提示符下運(yùn)行如下命令:
$ python manage.py runserver
http://127.0.0.1:8000/admin/
然后輸入你剛才創(chuàng)建的管理員賬號(hào)和密碼,登錄管理界面,你會(huì)看到下面這樣的畫(huà)面:
7.添加內(nèi)容
點(diǎn)擊Updates后面的“增加”按鈕,然后在”增加update“頁(yè)面的Text文本框中輸入些內(nèi)容,比如”我的第一條消息“:
輸入完畢后點(diǎn)擊”保存“按鈕。
8.編寫(xiě)視圖接下來(lái)我們開(kāi)始編寫(xiě)視圖,編輯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()
我們只寫(xiě)了一個(gè)簡(jiǎn)單的首頁(yè)視圖,這個(gè)視圖中的get_queryset方法甚至可以去掉,直接加入model=Update,也能實(shí)現(xiàn)同樣的效果。
9.編寫(xiě)模板
首先創(chuàng)建模板文件夾,在liveblog文件夾下建立templates文件夾,然后在templates下再建一個(gè)liveblog文件夾。
隨后我們?cè)谶@個(gè)文件夾下建立update_list.html文件,這個(gè)update_list.html文件的正確路徑應(yīng)該是:
liveblog/templates/liveblog/update_list.html
編輯update_list.html文件,加入如下內(nèi)容:
liveblog/templates/liveblog/update_list.html:
Liveblog 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; } Liveblog
本頁(yè)面會(huì)每隔15秒自動(dòng)更新一次——請(qǐng)不要 手動(dòng)刷新頁(yè)面!
{% if object_list %}{% for object in object_list %} {{ object.timestamp|date:"Y-m-d H:i:s" }}
暫無(wú)更新 - 請(qǐng)稍后重試!
{% endif %}10.設(shè)計(jì)URL
在liveblog文件夾下創(chuàng)建一個(gè)叫url.py的文件,然后添加如下內(nèi)容:
liveblog/urls.py :
from django.conf.urls import patterns, include, urlfrom 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, urlfrom django.contrib import admin urlpatterns= patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^live/', include('liveblog.urls')), )
我們來(lái)看一下首頁(yè),訪問(wèn)http://127.0.0.1:8000/live/:
現(xiàn)在,應(yīng)用看上去已經(jīng)做好了——但是,說(shuō)好的”ajax”呢?我們接下來(lái)給頁(yè)面加入Ajax功能,讓它能幫助我們實(shí)現(xiàn)自動(dòng)更新。
11.加入Ajax
實(shí)際上來(lái)說(shuō),網(wǎng)站“實(shí)現(xiàn)Ajax”主要包含了以下三個(gè)主要任務(wù)。
首先我們得先下載一個(gè)Ajax庫(kù),我們選擇了當(dāng)下比較流行的Jquery庫(kù),這是官方的下載地址:http://code.jquery.com/jquery-2.1.1.min.js,你也可以呆會(huì)直接下載我們的源代碼包,那里已經(jīng)給你準(zhǔn)備好了這個(gè)文件。
下載好jquery后,在項(xiàng)目根文件夾下建立一個(gè)media文件夾,然后再在其下建立一個(gè)js文件夾,將jquery-2.1.1.min.js文件放到j(luò)s文件夾下,這樣,文件夾的結(jié)構(gòu)會(huì)是下面這個(gè)樣子:
liveproject/ manage.py liveproject/ liveblog/ media/ js/ jquery-2.1.1.min.js
接下來(lái)我們要修改模板,把下面的代碼加入到”“和””之間:
liveblog/templates/liveblog/update_list.html:
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(' ' ); cycle_class= (cycle_class== "odd") ? "even" :"odd"; }); } ); } $(document).ready(function() { setInterval("update()",15000); })' + this.fields.text + '
然后我們編輯liveblog/views.py 文件,讓它變成下面這樣:
liveblog/views.py:
from django.http import HttpResponsefrom django.core import serializersfrom 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)置的序列化庫(kù),把模型對(duì)象轉(zhuǎn)換成json格式,再把它寫(xiě)到HttpRespose里去。最后,要讓JavaScript能正確解析和使用響應(yīng)的正文,還需要在響應(yīng)里設(shè)置Content-Type頭。
最后需要修改URL模式,編輯liveblog/urls.py 文件,讓它變成下面這樣:
liveblog/urls.py :
from django.conf.urls import patterns, include, urlfrom liveblog import views urlpatterns= patterns('', url(r'^$', views.IndexView.as_view(), name='index'), url(r'^updates-after/(?P\d+)/$', views.updates_after, name='updates_after'), )
編輯liveproject/urls.py 文件,讓它變成下面這樣:
liveproject/urls.py :
from django.conf.urls import patterns, include, urlfrom django.contrib import admin urlpatterns= patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^live/', include('liveblog.urls')), url(r'^(?P.*)', 'django.views.static.serve'), )
做完上述工作后,我們可以去測(cè)試一下,先刷新一下瀏覽器,然后到后臺(tái)新增一個(gè)update,比如叫”我的第二條消息“,回到首頁(yè)(http://127.0.0.1/live/),不要刷新頁(yè)面,觀察新添加的內(nèi)容有無(wú)被自動(dòng)刷新。
附:本實(shí)例源代碼下載地址:舍得學(xué)苑下載中心
【The End】
本文版權(quán)歸舍得學(xué)苑所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者和出處。謝謝!
作者:舍得
首發(fā):舍得學(xué)苑@博客園