(上一篇)

一、概述

Blog是一个博客应用。

dbe工程的目录结构,参考《序言》的最后部分。blog应用位于/home/russellluo/Django/dbe/dbe/blog目录下,blog目录的内容如下:

  1. blog/
  2. admin.py   (后台管理)
    forms.py     (表单)
    __init__.py (空文件,让Python能够将blog目录识别为一个package
    models.py    (数据库层)
    tests.py     (测试)
    urls.py      URL映射)
    views.py     (视图)

二、功能体验

因为blog应用是DBE中的第一个实例,所以对于如何配置和使用Django工程的研究会稍微细致一点。后面的实例中会跳过这些相同的细节,有疑问可以参考本篇内容,或者直接翻阅官方经典《The Django Book》 :-)

1. 配置blog

1)添加blog应用

这里不必使用"python manage.py startapp blog"新建blog应用,因为完整的blog源码已经就位。

打开/home/russellluo/Django/dbe/dbe/settings.py,找到INSTALLED_APPS,将blog应用添加到末尾:

  1. INSTALLED_APPS = (
  2. 'django.contrib.auth',
  3. 'django.contrib.contenttypes',
  4. 'django.contrib.sessions',
  5. 'django.contrib.sites',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. # Uncomment the next line to enable the admin:
  9. # 'django.contrib.admin',
  10. # Uncomment the next line to enable admin documentation:
  11. # 'django.contrib.admindocs',
  12. 'dbe.blog', # 添加的blog应用
  13. )

因为dbe工程主目录/home/russellluo/Django/dbe会被添加到Python搜索路径中(参考《Chapter 3: Views and URLconfs》侧边栏"Your Python Path"),因此"dbe.blog"就代表/home/russellluo/Django/dbe/dbe/blog目录对应的package。

2)配置数据库

blog/models.py中用到了Django的数据库层,因此需要为新建的dbe工程配置数据库。

打开/home/russellluo/Django/dbe/dbe/settings.py,找到DATABASES:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
  4. 'NAME': '', # Or path to database file if using sqlite3.
  5. # The following settings are not used with sqlite3:
  6. 'USER': '',
  7. 'PASSWORD': '',
  8. 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
  9. 'PORT': '', # Set to empty string for default.
  10. }
  11. }

因为Django自带sqlite3引擎,简便起见,这里使用sqlite3数据库,由此只需要配置'ENGINE'和'NAME'即可:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
  4. 'NAME': '/home/russellluo/Django/dbe/dbe/sqlite3.db', # Or path to database file if using sqlite3.
  5. # The following settings are not used with sqlite3:
  6. 'USER': '',
  7. 'PASSWORD': '',
  8. 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
  9. 'PORT': '', # Set to empty string for default.
  10. }
  11. }

3)配置URL映射

blog/urls.py中明确给出了blog应用的URL映射关系,将这些配置信息拷贝到dbe工程的URL映射文件/home/russellluo/Django/dbe/dbe/urls.py中:

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.conf.urls import patterns, include, url
  4. # 1.以下三行import语句拷贝自blog/urls.py
  5. from django.conf.urls.defaults import *
  6. from dbe.blog.models import *
  7. from dbe.blog.views import PostView, Main, ArchiveMonth
  8.  
  9. # Uncomment the next two lines to enable the admin:
  10. # from django.contrib import admin
  11. # admin.autodiscover()
  12.  
  13. urlpatterns = patterns('',
  14. # Examples:
  15. # url(r'^$', 'dbe.views.home', name='home'),
  16. # url(r'^dbe/', include('dbe.foo.urls')),
  17.  
  18. # Uncomment the admin/doc line below to enable admin documentation:
  19. # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  20.  
  21. # Uncomment the next line to enable the admin:
  22. # url(r'^admin/', include(admin.site.urls)),
  23. )
  24.  
  25. # 2.以下部分拷贝自blog/urls.py(为了不覆盖前面的URL映射,将原来的"="改成了更友好的"+=")
  26. urlpatterns += patterns("dbe.blog.views",
  27. (r"^post/(?P<dpk>\d+)/$" , PostView.as_view(), {}, "post"),
  28. (r"^archive_month/(\d+)/(\d+)/$" , ArchiveMonth.as_view(), {}, "archive_month"),
  29. (r"^$" , Main.as_view(), {}, "main"),
  30. # (r"^delete_comment/(\d+)/$" , "delete_comment", {}, "delete_comment"),
  31. )

4)配置Template路径

blog/views.py中使用了模板文件:如blog/list.html和blog/post.html,它们都位于/home/russellluo/Django/dbe/dbe/templates目录下,为了让Django能够成功找到这些template模板,需要配置Template路径。

打开/home/russellluo/Django/dbe/dbe/settings.py,修改TEMPLATE_DIRS如下:

  1. TEMPLATE_DIRS = (
  2. # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
  3. # Always use forward slashes, even on Windows.
  4. # Don't forget to use absolute paths, not relative paths.
        '/home/russellluo/Django/dbe/dbe/templates',
  5. )

2. 运行blog

1)一片空白的博客

完成上述配置后,blog应用就成功地添加到了dbe工程中。

为了观察blog应用的实际效果,需要执行以下三个步骤:

a)创建数据库的表:

  1. $ cd /home/russellluo/Django/dbe
    $ python manage.py syncdb
  2. Creating tables ...
  3. Creating table auth_permission
  4. Creating table auth_group_permissions
  5. Creating table auth_group
  6. Creating table auth_user_groups
  7. Creating table auth_user_user_permissions
  8. Creating table auth_user
  9. Creating table django_content_type
  10. Creating table django_session
  11. Creating table django_site
  12. Creating table blog_post
  13. Creating table blog_comment
  14.  
  15. You just installed Django's auth system, which means you don't have any superusers defined.
    Would you like to create one now? (yes/no): yes
    Username (leave blank to use 'rusellluo'): rusellluo
    Email address: me@cnblogs.com
    Password:
    Password (again):
    Superuser created successfully.
    Installing custom SQL ...
    Installing indexes ...
    Installed 0 object(s) from 0 fixture(s)

每一行Creating table **的打印表示对应创建了一个**表。以auth_和django_开头的表都用于Django的自带应用(这些应用都是默认注册好的,当然也可以通过修改settings.py去掉它们)。

以blog_开头的才是blog应用使用的表:blog_post和blog_comment(二者分别对应于Post和Comment两个Model类)。

特别地,如果是第一次创建数据库的表,Django的auth system(认证系统)会提醒你输入用于登录“后台管理”平台的账户和邮箱信息等,按照提示输入即可。

创建完数据库的表以后,用ls命令查看/home/russellluo/Django/dbe/dbe目录,会发现多了一个数据库文件sqlite3.db。

关于数据库层(Django的Model类)的基础知识,请参考《Chapter 5: Models》

b)开启Django自带的服务器:

  1. $ python manage.py runserver
    Validating models...
  2.  
  3. 0 errors found
    June 16, 2013 - 05:38:25
    Django version 1.5.1, using settings 'dbe.settings'
    Development server is running at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.

开启服务器前,manage.py脚本会首先自动检测数据库表的有效性(Validating models...),如果发现没有错误(0 errors found),才会成功开启服务器,否则将显示出错信息并终止退出。

对数据库表的检测也可以在开启服务器前手动触发:

  1. $ python manage.py validate
  2. errors found

c)进入127.0.0.1:8000主页:

在浏览器地址栏中输入127.0.0.1:8000并回车后,可以看到以下页面:

显而易见,载入页面时遇到了错误,错误位于"In template /home/russellluo/Django/dbe/dbe/templates/blog/list.html, error at line 1",提示原因"/home/russellluo/Django/dbe/dbe/templates/bbase.html (File does not exist)"。由此可知,该错误是由于 {% extends "bbase.html" %} 一行中,Django在TEMPLATE_DIRS所指定的路径下查找bbase.html失败,因为blog应用使用的bbase.html位于/home/russellluo/Django/dbe/dbe/templates/blog中。

消除这个错误的方法有两种:

  • 保留bbase.html的写法,在TEMPLATE_DIRS中新增一个模板搜索路径,使得Django可以成功找到bbase.html
  1. TEMPLATE_DIRS = (
  2. # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
  3. # Always use forward slashes, even on Windows.
  4. # Don't forget to use absolute paths, not relative paths.
        '/home/russellluo/Django/dbe/dbe/templates',
        '/home/russellluo/Django/dbe/dbe/templates/blog',
  5. )

需要注意的是,如果一个Django工程中有多个应用使用了相同名称的模板文件(如blog/bbase.html、forum/bbase.html),那么保留bbase.html的写法会有问题。因为Django查找模板文件时,会顺序搜索TEMPLATE_DIRS中给出的路径,因此任何直接写bbase.html的地方都会最终使用到blog/bbase.html,而不是该应用真正对应的那个bbase.html(如forum应用真正对应forum/bbase.html,但却使用的是blog/bbase.html)。

  • TEMPLATE_DIRS的配置不变,修改bbase.html的写法,改为 {% extends "blog/bbase.html" %}

幸运的是,在dbe工程中上述两种方法都可行。因为DBE源码中不存在相同名称的模板文件,所以方法一没问题;如果使用方法二,对于blog应用而言,需要修改blog/list.html和blog/post.html两个模板文件中的extends处理。

消除错误后,重新进入127.0.0.1:8000主页:

现在一切正常了!但是映入眼帘的blog主页未免也显得太单调了:除了两行英文以外,再没有其他有意义的内容,也没有任何链接可跳到其他页面。

blog应用的主要功能是发表文章和允许评论,所以起码要有人撰写文章才会有内容呈现。此时就需要使用Django的后台管理系统(Admin Site)。

2)有文章,有评论,这才叫博客

要使用Django的后台管理系统撰写文章,需要两步操作:

  • 开启Admin功能
  • 利用后台管理界面撰写并保存文章(添加Post数据)

由于Admin是Django通用的后台管理系统,与本篇blog应用的具体内容关系不大。详细的使用方法在《Chapter 6: The Django Admin Site》中有很好的讲解,因此这里不再赘述。

使用Django后台撰写好文章后,再次打开blog主页:

点击"Admin"链接可以进入后台管理系统的主界面:

点击"Add post"链接可以直接进入撰写文章的界面:

点击"Comments (0)"链接则可以查看并评论该文章:

后面的操作跟平常上网看文章没啥区别了,就不再一一演示,可以自己实际动手体验一下。

【Django实例】博客1的更多相关文章

  1. Django 系列博客(十三)

    Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...

  2. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

  3. Django 系列博客(十一)

    Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...

  4. Django 系列博客(七)

    Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...

  5. Django 系列博客(四)

    Django 系列博客(四) 前言 本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改 ORM简介 ORM全称是:Object Relational Mappin ...

  6. Django搭建博客网站(四)

    Django搭建博客网站(四) 最后一篇主要讲讲在后台文章编辑加入markdown,已经在文章详情页对markdown的解析. Django搭建博客网站(一) Django搭建博客网站(二) Djan ...

  7. Django搭建博客网站(三)

    Django搭建博客网站(三) 第三篇主要记录view层的逻辑和template. Django搭建博客网站(一) Django搭建博客网站(二) 结构 网站结构决定我要实现什么view. 我主要要用 ...

  8. Django搭建博客网站(二)

    Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...

  9. Django(博客系统):基于pycharm如何一个django工程下创建多个app

    背景:通常我们创建一个django系统时,为了把业务模块划分清楚往往会把一个独立的业务模块放到一个app中,如果多个独立的业务模块就会创建多个app,一般情况下为了更好的管理这些app,会把他们都存放 ...

  10. Django练习——博客系统小试

    在上一篇博客Todolist的基础上(http://blog.csdn.net/hcx25909/article/details/24251427),本周继续进行实践,这次我要搭建一个简单的博客系统. ...

随机推荐

  1. C++自学第二课:对象和类的概念

    既然是C++,比C语言多了最重要的概念:面向对象. 面向对象?对象是什么?Girlfriend? 我天天面向她也没学会C++. 我觉得对象就是有统一特征的一类编程目标. 打个比方说墙上有个开关,我一按 ...

  2. Vyatta 网络操作系统

    原文发表于:2010-09-19 转载至cu于:2012-07-21 以下是"开源中国社区"写到的: http://www.oschina.net/news/11423/vyatt ...

  3. 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  4. 导出Office365中的组及成员

    Set-ExecutionPolicy unrestricted $cred = Get-Credential  $session = New-PSSession -ConfigurationName ...

  5. #Ubuntu 18.04 安装tensorflow-gpu 1.9

    参考 https://tensorflow.google.cn/install/install_linux http://nvidia.com/cuda http://developer.nvidia ...

  6. 互评Alpha版本——基于spec评论作品

    组名:可以低头,但没必要 组长:付佳 组员:张俊余  李文涛  孙赛佳  田良  于洋  刘欣  段晓睿 一.二次元梦之队----I DO 在测评该项目时,我们组索要了该组的apk程序,安装之后我就开 ...

  7. 【每日scrum】NO.9

    (1)这是我们冲刺的最后一天,晚上我们的团队进行了收尾工作:第一阶段的任务基本完成,软件主要实现了校园景点照片以及对应的介绍,查询最短路径,查询涉及相关景点的查询,查询全部路径,基本界面的设计,导航功 ...

  8. 团队Alpha冲刺(五)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  9. CSU 1808: 地铁 最短路

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 1808: 地铁 Time Limit: 5 SecMemory Limit: ...

  10. php addslashes和stripslashes函数

    addslashes — 使用反斜线引用字符串 stripslashes — 反引用一个引用字符串   Example #1 一个 addslashes() 例子 <?php$str = &qu ...