BLOG
Enjoy when you can, and endure when you must.
NOV 05, 2012/Django
Django个人博客开发(三)

本文已历史长远,建议阅读最新的《用 Django 构建简易博客》系列文章

 

模型已经成功完成, 这一节让我们来继续其它几个基础部分的创建。

这一部分的主要内容:

· 模型的基本操作

· 第一个视图

· 模板基础

· URLConf初探

 

一、模型(续) —— 基本的操作:

上一节中,我们已经成功建立了几个需要的模型,这里就简单说一下基本的模型操作:

   · 插入数据:new_blog = Article(caption='my blog title', author='author', classification='classification', content = 'blog content')

   · 保存数据:new_blog.save()

   · 获取数据 / 更新数据:id = new_blog.id / new_blog.caption = 'new title'

   · 选择表中的所有对象:blogs = Article.objects.all()

   · 过滤数据:specified_blogs = Article.objects.filter(classification='classification')

   · 获取单个对象:blog = Article.objects.get(name='my blog title')

   · 排序:blogs = Article.objects.order_by('name')

   · 删除数据:blog.delete()

其中objects属性被称为管理器,其管理着所有针对数据包含、还有最重要的数据查询的表格级操作。所有的模型都自动拥有一个objects管理器。

       

二、第一个视图:

了解了模型的操作方法后,我们可以开始建立视图了。第一个视图,我们要做的是将已经发布的博客展示出来,以我自己的主页为例,包括博客的标题、分类、发布时间、内容以及标签(评论等之后再说)。

视图包含存取模型及调取恰当模板的相关逻辑。要实现将所有的Blog显示出来,首先需要利用模型操作从数据库中提取所有的Blog,然后提交给模板(这是之后的内容)形成所需的页面。

打开blog应用下的views.py,并输入以下内容:

from blog.models import Article, Tag, Classification
from django.shortcuts import render_to_response
from django.template import RequestContext
           
def blog_list(request):
    blogs = Article.objects.all().order_by('-publish_time')
               
    return render_to_response('index.html', {"blogs": blogs}, context_instance=RequestContext(request))

· 第一行从models.py中导入了之前创建的模型;

· 在函数内部,我们利用模型的操作方法分别从Article、Tag、Classification中获取了所有的blog对象、tag对象和classification对象;

· 最后调用了render_to_response方法,它的第一个参数是要使用的模板名称;第二个参数是为该模板创建 Context 时所使用的字典,可以理解为要传入模板的参数;而RequestContext默认地在模板context中加入了一些变量,如HttpRequest对象或当前登录用户的相关信息。

 

三、模板的使用:

 

模板是一个文本,用于分离文档的表现形式和内容。 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。模板通常用于产生HTML。

在上面的视图函数中,我们在render_to_response的第一个参数中指定了“index.html”,但django要怎么找到它呢?我们需要做一些配置。

首先,回到项目的根目录,新建一个文件夹并命名为templates。然后打开项目的配置文件settings.py,并找到以下行:

   TEMPLATE_DIRS = (

   # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".

   # Always use forward slashes, even on Windows.

   # Don't forget to use absolute paths, not relative paths.

    )

把我们之前所创建的文件夹的绝对路径加入进TEMPLATE_DIRS里,如:

   TEMPLATE_DIRS = (

       '/home/danny/dblog/templates',

   )

注意这里必须使用绝对路径。保存并关闭,进入到templates目录,新建文件"index.html"并输入如下内容:

{% for blog in blogs %}
  <div class="blog_body">
    <div class="blog_title"><a href="/blog/detail/?id={{ blog.id }}">{{ blog.caption }}</a></div>
    <div class="blog_info">
      <ul class="blog_info_list">
        <li>分类:{{ blog.classification }}</li>
        <li>发表时间:{{ blog.publish_time|date:"Y-m-d H:i" }}</li>
        <li>标签:
          {% for tag in blog.tags.all %}
            {{ tag.tag_name }}
          {% endfor %}
        </li>
      </ul>
    </div>
    <div class="blog_description">
      {{ blog.content }}
    </div>
  </div>
{% endfor %}

请注意,这不是一个完整的网页,这只是刚开始的演示,完整的页面我们在之后再一步步创建。

其中,用两个大括号括起来的文字(如{{ blog.caprion }})称为变量,这意味着在此处插入变量的值;

被大括号和百分号包围的文本(如{% for blog in blogs %})是模板标签,即通知模板系统完成某些工作;

在输出“发表时间”时,在变量后还跟着一个管道符“|”,这是过滤器,是一种便捷的转换变量输出格式的方式。

要了解更多关于模板的知识,请参考官方文档。

接着,我们还需要一个步骤,那就是指定应该怎样才能访问到这个页面。

 

四、URLConf:

现在,如果你再运行:python manage.py runserver,你还将看到Django的欢迎页面,而不会出现我们希望显示的博客页面。那是因为我们的项目还对blog_list这个视图一无所知。我们需要通过一个详细描述的URL来显式的告诉它并且激活这个视图。为了绑定视图函数和URL,我们使用URLconf。

URLconf就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

现在,让我们打开项目目录下的urls.py,并添加我们之前创建的blog_list:

urlpatterns = patterns('',
    url(r'^$', 'blog.views.blog_list', name='blog_list'),
)

注意,这里我为了节约篇幅删除了默认的一些注释,实际中你应该保留它们,其中包含了一些Django中常用的功能,仅仅只需去掉这些注释就可以开启这些功能。

 

五、预览到目前为止的成果:

现在,再次运行 python manage.py runserver 0.0.0.0:8000,并在浏览器中访问,可以看到以下页面:

可以发现,只显示出“My Blog List”,因为我们还没在数据库中添加任何博客。

这只是一个简单的演示,我们之前的操作还存在太多的漏洞需要修补,这就是我们接下来需要做的。

这一部分内容就到这里,如需系统学习,可以参考《The Django Book》第三、四章内容。

COMMENTS
05/04From stormsha

django还是好用,对初学者很友好,参考博主的文章,自己的第一个django作品 终于上线了
https://stormsha.com

11/05From good

3.在评论那块 掉了 {% for blog in blogs %}

15/01From ian

正如博主说的一样,文章中给出的只是一段模板标签,若想显示出文章最后贴出的展示效果可以在body标签中加入类似<h1>My Blog List</h1>,后面跟上模板标签即可。

06/10From Augustus

博主您好,非常感谢您共享这么优秀有帮助的博客。我想问一下,按照这篇博客一步一步做以后,出现了UnicodeDecodeError该怎么办,问题指向了render_to_response('index.

07/09From Danny

这篇博客已经很好了,我看了下,如果单照本文做的话,好像中间渲染的那个模板只是一个片段,只是在迭代blog,所以可能为空。

03/09From imkh

博客,您好。为什么我按占你的步骤配置了,最后显示页面的时候是空白的内容?没有”My Blog List“出来啊。是什么问题啊?

27/08From 莲花子

膜拜

LEAVE COMMNT