相信使用django的朋友,很多都是从搭博客开始的,虽然没什么新意,但是个人觉得还是很有意义的!毕竟学习资源会很多,而且搭好的博客可以自己拿来使用!!
下面我把自己搭建博客的一些过程总结记录下来~以供大家参考。
一.环境的搭建
开发环境:
Ubuntu 14.04
python2.7.6
django1.8
virtualenv
Bootstrap3.0
环境搭建:
安装virtualenv :
sudo pip install virtualenv
创建并激活虚拟环境 :
virtualenv blog
cd blog
source bin/activate
virtualenv可创建独立的python开发环境,在虚拟的工作环境下安装的相关软件会安装在当前环境下,所以不同的虚拟环境互不干扰,有利于不同版本的python开发。
安装Django1.8 :
pip install Django==1.8
如果使用sqlite,安装pytz :
pip install pytz
二.项目创建
我们创建一个名为jiange_blog的Django项目,创建项目的指令如下:
$ django-admin.py startproject my_blog
看一下项目的结构:
$ tree jiange_blog
jiange_blog/
├── jiange_blog
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
建立Django app:
在一个项目下,可以建立多个app,其实app相当于一个功能模块,比如我的博客是一个模块,然后我可以将评论,登陆认证模块独立出来做成模块,方便代码的管理,重用等。
建立一个blog app
$ python manage.py startapp blog
jiange_blog/
├── blog
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── jiange_blog
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── manage.py
在应用blog下面,models.py是数据库部分,views.py是视图处理部分,admin.py是后台管理部分。
建立了app后,我们需要在jiange_blog/jiange_blog/settings.py里面添加我们的新应用:
33 INSTALLED_APPS = (
34 'django.contrib.admin',
35 'django.contrib.auth',
36 'django.contrib.contenttypes',
37 'django.contrib.sessions',
38 'django.contrib.messages',
39 'django.contrib.staticfiles',
40 'blog', #我的blog app
41 )
进行下数据库迁移并运行:
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
打开http://127.0.0.1:8000/,如果你看到“It worked!”,那么恭喜,一切顺利!
总结:创建项目,创建app,配置app。
二.Moldes——数据库定义
每一个Django Model都继承自django.db.models.Model。
我们在Models里定义的每一个类都对应了一张表,每一个成员对应了一个属性。
django提供的数据库接口,使得我们不需要自己编写SQL语句就可以操作数据库了。
设置数据库
数据库的设置可以在jiange_blog/jiange_blog/setting.py下进行,默认使用的是sqlite3,在此我也使用这个默认的数据库即可。
DATABASES = {
79 'default': {
80 'ENGINE': 'django.db.backends.sqlite3',
81 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
82 }
83 }
创建数据库
编辑/jiange_blog/blog/models.py:
#coding:utf-8
from django.db import models
#用来修改admin中显示的app名称,因为admin app 名称是用 str.title()显示的,所以修改str类的title方法就可以实现.
class string_with_title(str):
def __new__(cls, value, title):
instance = str.__new__(cls, value)
instance._title = title
return instance
def title(self):
return self._title
__copy__ = lambda self: self
__deepcopy__ = lambda self, memodict: self
# Create your models here.
STATUS = {
0: u'正常',
1: u'草稿',
2: u'删除',
}
class Category(models.Model):
name = models.CharField(max_length=40,verbose_name=u'名称')
rank = models.IntegerField(default=0,verbose_name=u'排序')
status = models.IntegerField(default=0,choices=STATUS.items(),verbose_name='状态')
create_time = models.DateTimeField(u'创建时间',auto_now_add=True)
class Meta:
verbose_name_plural = verbose_name = u'分类'
ordering = ['rank','-create_time']
app_label = string_with_title('blog',u"博客管理")
def __unicode__(self):
return '%s' % (self.name)
class Article(models.Model):
category = models.ForeignKey(Category,verbose_name=u'分类')
title = models.CharField(max_length=100,verbose_name=u'标题')
en_title = models.CharField(max_length=100,verbose_name=u'英文标题')
summary = models.TextField(verbose_name=u'摘要')
content = models.TextField(verbose_name=u'正文')
view_times = models.IntegerField(default=0)
is_top = models.BooleanField(default=False,verbose_name=u'置顶')
rank = models.IntegerField(default=0,verbose_name=u'排序')
status = models.IntegerField(default=0,choices=STATUS.items(),verbose_name='状态')
pub_time = models.DateTimeField(default=False,verbose_name=u'发布时间')
create_time = models.DateTimeField(u'创建时间',auto_now_add=True)
update_time = models.DateTimeField(u'更新时间',auto_now=True)
class Meta:
verbose_name_plural = verbose_name = u'文章'
ordering = ['rank','-is_top','-pub_time','-create_time']
app_label = string_with_title('blog',u"博客管理")
def __unicode__(self):
return self.title
其中的unicode(self)定义了它的显示方式,比如我输出一个models对象,它是输出id呢,还是输出name呢还是其他?就是由这个函数来定义了~
另外,记得在开头加上coding:utf-8,不然中文编码不了哦~
好了,我们更新下数据库,即把models里的定义同步到数据库中~
python manage.py makemigrations
python manage.py migrate
有了数据库,我们以后就可以对它进行一系列操作啦,至于具体的增删改查操作,这里不细说了,大家自行学习,在下面如果遇到了,我会稍微解释以下,而不在这里单独讲~
三.管理数据库:Admin
Django很好的一点就是,为我们提供了一个后台管理app,通过它,我们可以在后台进行数据库的管理!
我们查看下jiange_blog/jiange_blog/settings.py:
INSTALLED_APPS = (
'django.contrib.admin', #默认开启了admin
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
那么,怎么进入后台呢? 我们查看下jiange_blog/jiange_blog/urls.py:
urlpatterns = [
# Examples:
# url(r'^$', 'jiange_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
]
所以,我们只需要在开启我们服务的情况下,登陆http://127.0.0.1:8000/admin即可进入后台啦~
想要登陆,当然要先注册一个用户咯~
python manage.py createsuperuser
#可以帮助我们创建一个超级用户,创建成功后就可以登陆咯~
奇怪,登陆进去之后,为什么没有看到我们的数据库呢?
别着急,我们要先在jiange_blog/blog/admin.py中进行设置:
#coding:utf-8
from django.contrib import admin
from blog.models import Article,Category
# Register your models here.
admin.site.register(Category)
admin.site.register(Article)
再次刷新后台,就可以看到我们的数据库了。
我们的数据库看起来是不是有点丑!没关系,我们可以使用bootstrap来进行美化:
pip install bootstrap-admin
然后在jiange_blog/jiange_blog/setting.py中修改INSTALLED_APPS:
INSTALLED_APPS = (
'bootstrap_admin', #一定要放在`django.contrib.admin`前面
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
BOOTSTRAP_ADMIN_SIDEBAR_MENU = True
再次打开后台,是不是好看很多?!
四.Views和url
当你在浏览器中输入http://127.0.0.1:8000/时,它就会跑到urls.py里面寻找与正则表达式”^$”(表示空串)匹配的url,进入对应的views函数中进行数据的处理,并对要返回的页面进行渲染,之后把结果返回给用户!
我们具体看一个例子:
首先看一下jiange_blog/jiange_blog/urls.py:
urlpatterns = [
# Examples:
# url(r'^$', 'jiange_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
]
为方便管理,我们按照它的建议,在jiange_blog/blog/下新建一个urls.py,然后修改jiange_blog/jiange_blog/urls.py,把它include进来:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('blog.urls')),
]
我们先创建一个views,进入jiange_blog/blog/views.py:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello World, Django")
修改jiange_blog/blog/urls.py,建立映射:
from django.conf.urls import url
from blog.views import index
urlpatterns = [
url(r'^$', index),
]
浏览器输入http://127.0.0.1:8000/ ,可以成功看到”Hello World, Django”了!