实战Django:LiveBlog

《Django Web开发指南》的实例讲的差不多了,除了今天要介绍的LiveBlog,还有一个Pastebin。这样,书中的实例基本讲完了。做完这些实例之后,舍得建议回头看看这本书,或许你会从书中找到舍得所讲的实例里忽略掉的一些细节。此外,《Django Web开发指南》中有几个章节是关于Django的基础或高级技术的,建议阅读并设法把它应用到你所练习过的实例中。

正如你已经看到的,Django提供了丰富的内置功能,你可以很轻松地用这些功能来完成很多工作。但和所有的工具一样,Django也不是万能的,它缺乏的最明显的一个Web功能就是没有集成Ajax,即异步JavaScript和XML。
在这个实例中,我们要展示一个相对简单的Ajax应用,即“liveblog"。liveblog是一个列出了一系列简短的,带时间戳的条目的网页,它能进行自动更新,而无须你去刷新页面。

1.创建项目和应用



我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如“c:\python32\Scripts”),然后运行如下命令:

$ django-admin startproject liveproject

然后在dos命令提示符下继续输入如下命令,进入项目文件夹:

cd liveproject

接下来开始创建应用,在dos命令提示符下输入命令:

$ python manage.py startapp liveblog

命令执行完后,项目根文件夹下会出现一个叫liveblog的文件夹,应用创建完毕。

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
        )

3.激活模型



首先修改liveproject/settings.py这个文件,找到INSTALLED_APPS这段设置,把它改成下面这个样子:

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的时候,建议顺便修改一下语言和时区的设置,具体的方法请参考:《实战Django:官方实例Part1》

此外,找到文件中的:

USE_TZ = True

把它改为:

USE_TZ = False

然后在dos命令提示符下运行如下命令:

$ python manage.py makemigrations liveblog

继续在dos命令提示符下运行命令:

$ python manage.py migrate

这样,数据库就建好了。

4.创建管理员账号



在dos命令提示符下运行如下命令:

$ python manage.py createsuperuser

然后依次输入admin,你的邮箱,输入两次密码,完成创建管理员的操作。

5.在管理界面注册应用



编辑liveblog/admin.py 文件,让它变成下面这个样子:

liveblog/admin.py

from django.contrib import admin
from liveblog.models import Update

admin.site.register(Update)

6.启动服务器



在dos命令提示符下运行如下命令:

$ python manage.py runserver

服务器启动成功后,打开浏览器,在地址栏内输入:

http://127.0.0.1:8000/admin/

然后输入你刚才创建的管理员账号和密码,登录管理界面,你会看到下面这样的画面:

7.添加内容



点击Updates后面的“增加”按钮,然后在”增加update“页面的Text文本框中输入些内容,比如”我的第一条消息“:

输入完毕后点击”保存“按钮。

8.编写视图



接下来我们开始编写视图,编辑liveblog/views.py 文件,添加下面的内容:

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,也能实现同样的效果。

9.编写模板



首先创建模板文件夹,在liveblog文件夹下建立templates文件夹,然后在templates下再建一个liveblog文件夹。

随后我们在这个文件夹下建立update_list.html文件,这个update_list.html文件的正确路径应该是:

liveblog/templates/liveblog/update_list.html

编辑update_list.html文件,加入如下内容:

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; }
            h1 { 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>
        <h1>Liveblog</h1>
        <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.设计URL



liveblog文件夹下创建一个叫url.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‘),
    )

编辑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/

现在,应用看上去已经做好了——但是,说好的”ajax”呢?我们接下来给页面加入Ajax功能,让它能帮助我们实现自动更新。

11.加入Ajax



实际上来说,网站“实现Ajax”主要包含了以下三个主要任务。

  • 导入类库:需要告诉我们的页面,使用哪个Ajax库;
  • 定义客户端回调函数:我们需要在模板中加入一个向服务器发出请求的函数,并用返回的结果更新网页;
  • 定义服务器端逻辑:我们必须定义一个响应客户端请求的视图。

首先我们得先下载一个Ajax库,我们选择了当下比较流行的Jquery库,这是官方的下载地址:http://code.jquery.com/jquery-2.1.1.min.js,你也可以呆会直接下载我们的源代码包,那里已经给你准备好了这个文件。

下载好jquery后,在项目根文件夹下建立一个media文件夹,然后再在其下建立一个js文件夹,将jquery-2.1.1.min.js文件放到js文件夹下,这样,文件夹的结构会是下面这个样子:

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‘,‘ ‘)
                                + ‘

<div class="text">‘
                                + this.fields.text
                                + ‘

<div class="clear">

‘
                            );
                            cycle_class = (cycle_class == "odd")
                                ? "even" : "odd";
                        });
                    }
                );

            }
            $(document).ready(function() {
                setInterval("update()", 15000);
            })
        </script>

然后我们编辑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内置的序列化库,把模型对象转换成json格式,再把它写到HttpRespose里去。最后,要让JavaScript能正确解析和使用响应的正文,还需要在响应里设置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/),不要刷新页面,观察新添加的内容有无被自动刷新。

附:本实例源代码下载地址:舍得学苑下载中心

【The End】

本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:舍得

首发:舍得学苑@博客园

 
时间: 2025-01-05 08:17:52

实战Django:LiveBlog的相关文章

实战Django:Pastebin

  这是<Django Web开发指南>中的最后一个实例.如果说上一个实例Liveblog重点讲的是Django和Ajax的协作,那么我们在Pastebin中,将学习到Django和高亮语法JS的协作,顺便复习一下在Django中加入表单. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject pastebinpr

实战Django:简易博客Part1

舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能的习惯.这可不是舍得的独创,在象棋.围棋界中,历来有"打谱"一说,就是根据棋谱,把一步步棋摆出来,在打谱的过程中,去感悟.去吸收,此时感悟到的.吸收进的,才是属于你自己的东西.新的技能就这样一步步发展起来,逐渐壮大. 就象Django官方文档那样,一个实例看起来很简单,但作为初学者,用&q

实战Django:简易博客Part2

在Part1中,我们完成了本项目的基本框架搭建,并完善了一下管理后台,现在我们来看如何设计面向公共的页面部分. 8.创建模板 首先,请在blog文件夹下建立templates文件夹,然后,在templates文件夹中建立一个叫bog的文件夹,在这个bog文件夹下新建一个archive.html文件,这个文件的路径应该是: bog/templates/bog/archive.html 把下面这些代码添加到archive.html中: bog/templates/bog/archive.html:

实战Django:小型CMS Part2

回顾一下我们之前讲过的几个实例的流程,现在,我们只要添加一些内容(用来测试),创建视图.模板和URL模式,就能完成这个小型的CMS了.   7.添加内容 我们先来创建一个分类,点击Categories后面的"增加"按钮,然后在Label文本框中输入:"Django",在slug文本框后面输入"django"(django不用输入也能自动出现,你可以改成自己喜欢的名字): 随后点击后面的"保存"按钮. 点击左上方的"首

实战Django:官方实例Part1

[写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心得整理出来,以规范的.方便新人上手的撰写方式来写这个实战系列,相信对刚接触Django的童鞋会有一定的帮助. 舍得这里所用到的版本,为Django 1.7.1,Python 3.2,想要按照舍得讲解的实例上手练习的话,请务必与舍得所用的版本保持一致. 实例是在Windows系统下调试的,如果你采用的是非Win

实战Django:Rango Part1

在前面我们已经陆续学习了六个Django的实例,其中一个来自Django官方的文档,另外五个来自<Django Web开发指南>.舍得介绍的每一个实例,都是按照官方文档的标准,力求让大家在根据文章去做自己的实例时,能够按"文"索骥,轻松再现整个实例的制作过程. 接下来,舍得要介绍一个大型的实例,这个项目叫做Rango,它来自Django圈内口碑甚佳的<How to Tango with Django>一书.事实上,此书就是围绕Rango这一个实例来展开的,而且,

实战Django:小型CMS Part1

CMS,即Content Management System,内容管理系统.我们这里要开发的小型CMS应用,从结构上和blog应用有些类似,但我们会在这里加入一些新的技术,比如说工作流.搜索功能.编辑组件等. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject cmsproject 然后在dos命令提示符下继续输入如下命令,

实战Django:Rango Part6

24.优化模板 在这个项目中,从已经做过的模板来看,你可能会注意到里面有很多重复的代码.这种重复不仅带来大量无谓的工作量,而且以后调整起来也极为不便. 因此,最理想的做法是将那些重复的代码放到基础模板中,然后从基础模板再扩展出一个个新的模板. 我们先来做这个基础模板,在templates/rango文件夹下新建一个base.html文件,然后添加以下内容: templates/rango/base.html: <!DOCTYPE html> <html> <head>

实战Django:Rango Part7

26.用Django-Registration-Redux进行用户校验 Django中,有好多现成的应用提供了注册.登录.校验等功能,我们只要稍稍改动一下URL映射.视图和模板就可以使用它们.在这一章,我们将介绍用Django-Registration-Redux,顺便学习一下如何把外部的应用加到我们的项目中. (1)安装Django-Registration-Redux 在Dos命令提示符下转到Python的Scripts文件夹,然后运行如下命令: pip install django-reg