【Django实例】博客1
一、概述
Blog是一个博客应用。
dbe工程的目录结构,参考《序言》的最后部分。blog应用位于/home/russellluo/Django/dbe/dbe/blog目录下,blog目录的内容如下:
- blog/
- 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应用添加到末尾:
- INSTALLED_APPS = (
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.sites',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- # Uncomment the next line to enable the admin:
- # 'django.contrib.admin',
- # Uncomment the next line to enable admin documentation:
- # 'django.contrib.admindocs',
- 'dbe.blog', # 添加的blog应用
- )
因为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:
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
- 'NAME': '', # Or path to database file if using sqlite3.
- # The following settings are not used with sqlite3:
- 'USER': '',
- 'PASSWORD': '',
- 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
- 'PORT': '', # Set to empty string for default.
- }
- }
因为Django自带sqlite3引擎,简便起见,这里使用sqlite3数据库,由此只需要配置'ENGINE'和'NAME'即可:
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
- 'NAME': '/home/russellluo/Django/dbe/dbe/sqlite3.db', # Or path to database file if using sqlite3.
- # The following settings are not used with sqlite3:
- 'USER': '',
- 'PASSWORD': '',
- 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
- 'PORT': '', # Set to empty string for default.
- }
- }
3)配置URL映射
blog/urls.py中明确给出了blog应用的URL映射关系,将这些配置信息拷贝到dbe工程的URL映射文件/home/russellluo/Django/dbe/dbe/urls.py中:
- # -*- coding: utf-8 -*-
- from django.conf.urls import patterns, include, url
- # 1.以下三行import语句拷贝自blog/urls.py
- from django.conf.urls.defaults import *
- from dbe.blog.models import *
- from dbe.blog.views import PostView, Main, ArchiveMonth
- # Uncomment the next two lines to enable the admin:
- # from django.contrib import admin
- # admin.autodiscover()
- urlpatterns = patterns('',
- # Examples:
- # url(r'^$', 'dbe.views.home', name='home'),
- # url(r'^dbe/', include('dbe.foo.urls')),
- # Uncomment the admin/doc line below to enable admin documentation:
- # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
- # Uncomment the next line to enable the admin:
- # url(r'^admin/', include(admin.site.urls)),
- )
- # 2.以下部分拷贝自blog/urls.py(为了不覆盖前面的URL映射,将原来的"="改成了更友好的"+=")
- urlpatterns += patterns("dbe.blog.views",
- (r"^post/(?P<dpk>\d+)/$" , PostView.as_view(), {}, "post"),
- (r"^archive_month/(\d+)/(\d+)/$" , ArchiveMonth.as_view(), {}, "archive_month"),
- (r"^$" , Main.as_view(), {}, "main"),
- # (r"^delete_comment/(\d+)/$" , "delete_comment", {}, "delete_comment"),
- )
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如下:
- 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.
'/home/russellluo/Django/dbe/dbe/templates',- )
2. 运行blog
1)一片空白的博客
完成上述配置后,blog应用就成功地添加到了dbe工程中。
为了观察blog应用的实际效果,需要执行以下三个步骤:
a)创建数据库的表:
- $ cd /home/russellluo/Django/dbe
$ python manage.py syncdb- Creating tables ...
- Creating table auth_permission
- Creating table auth_group_permissions
- Creating table auth_group
- Creating table auth_user_groups
- Creating table auth_user_user_permissions
- Creating table auth_user
- Creating table django_content_type
- Creating table django_session
- Creating table django_site
- Creating table blog_post
- Creating table blog_comment
- 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自带的服务器:
- $ python manage.py runserver
Validating models...- 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),才会成功开启服务器,否则将显示出错信息并终止退出。
对数据库表的检测也可以在开启服务器前手动触发:
- $ python manage.py validate
- 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
- 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.
'/home/russellluo/Django/dbe/dbe/templates',
'/home/russellluo/Django/dbe/dbe/templates/blog',- )
需要注意的是,如果一个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的更多相关文章
- Django 系列博客(十三)
Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...
- Django 系列博客(十二)
Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...
- Django 系列博客(十一)
Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...
- Django 系列博客(七)
Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...
- Django 系列博客(四)
Django 系列博客(四) 前言 本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改 ORM简介 ORM全称是:Object Relational Mappin ...
- Django搭建博客网站(四)
Django搭建博客网站(四) 最后一篇主要讲讲在后台文章编辑加入markdown,已经在文章详情页对markdown的解析. Django搭建博客网站(一) Django搭建博客网站(二) Djan ...
- Django搭建博客网站(三)
Django搭建博客网站(三) 第三篇主要记录view层的逻辑和template. Django搭建博客网站(一) Django搭建博客网站(二) 结构 网站结构决定我要实现什么view. 我主要要用 ...
- Django搭建博客网站(二)
Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...
- Django(博客系统):基于pycharm如何一个django工程下创建多个app
背景:通常我们创建一个django系统时,为了把业务模块划分清楚往往会把一个独立的业务模块放到一个app中,如果多个独立的业务模块就会创建多个app,一般情况下为了更好的管理这些app,会把他们都存放 ...
- Django练习——博客系统小试
在上一篇博客Todolist的基础上(http://blog.csdn.net/hcx25909/article/details/24251427),本周继续进行实践,这次我要搭建一个简单的博客系统. ...
随机推荐
- C++自学第二课:对象和类的概念
既然是C++,比C语言多了最重要的概念:面向对象. 面向对象?对象是什么?Girlfriend? 我天天面向她也没学会C++. 我觉得对象就是有统一特征的一类编程目标. 打个比方说墙上有个开关,我一按 ...
- Vyatta 网络操作系统
原文发表于:2010-09-19 转载至cu于:2012-07-21 以下是"开源中国社区"写到的: http://www.oschina.net/news/11423/vyatt ...
- 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join
作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...
- 导出Office365中的组及成员
Set-ExecutionPolicy unrestricted $cred = Get-Credential $session = New-PSSession -ConfigurationName ...
- #Ubuntu 18.04 安装tensorflow-gpu 1.9
参考 https://tensorflow.google.cn/install/install_linux http://nvidia.com/cuda http://developer.nvidia ...
- 互评Alpha版本——基于spec评论作品
组名:可以低头,但没必要 组长:付佳 组员:张俊余 李文涛 孙赛佳 田良 于洋 刘欣 段晓睿 一.二次元梦之队----I DO 在测评该项目时,我们组索要了该组的apk程序,安装之后我就开 ...
- 【每日scrum】NO.9
(1)这是我们冲刺的最后一天,晚上我们的团队进行了收尾工作:第一阶段的任务基本完成,软件主要实现了校园景点照片以及对应的介绍,查询最短路径,查询涉及相关景点的查询,查询全部路径,基本界面的设计,导航功 ...
- 团队Alpha冲刺(五)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- CSU 1808: 地铁 最短路
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 1808: 地铁 Time Limit: 5 SecMemory Limit: ...
- php addslashes和stripslashes函数
addslashes — 使用反斜线引用字符串 stripslashes — 反引用一个引用字符串 Example #1 一个 addslashes() 例子 <?php$str = &qu ...