前言:最近准备写一个自己的个人博客。本来想用.net开发的,由于VS有点装不上,最近学习Python。选择了python的web框架Django。
开发环境:Ubuntu 14.04
开发工具:Pychram 2016.1.0 社区版
Python版本:2.7.6
Django版本:1.9.6
<参考资料>—前人文章:http://my.oschina.net/jastme/blog/345265
下面开始:
1.工具安装:
python已经自带;打开Pychram
File–>settings–>Project **–>Project Interpreter
点击绿色的+号,搜索Django -->选择 Install Package即可安装完成.
输入:import django
验证是否安装成功。如果没有报错,表示成功。
2.创建工程
PS:路径最好不要包含中文,否则会报错
打开终端输入:
django-admin.py startproject mysite
cd mysite
python manage.py startapp blog
django-admin.py startproject mysite
新建了许多工程文件:
manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
urls.py ----- 负责把URL模式映射到应用程序。
python manage.py startapp blog
创建了Blog应用
用Pychram打开工程:可以看到下面的文件结构:
然后在/mysite/mysite/settings.py里面的
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
添加’blog’,
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
表示添加一个blog app
3.数据库创建
django使用代码的方式创建数据库。
首先修改mysite/blog/models.py 继承默认的数据库类,创建数据库
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class BlogPost(models.Model):
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()
BlogPost类是django.db.models.Model的一个子类 。它有变量title(blog的标题),body(blog的内容部分),timestamp(blog的发表时间)
这里只是设计了数据库,并没有创建数据库。
Dajango支持主流的数据库服务器(MySQL,PostgreSQL,Oracle和MSSQL),但本项目使用SQLite,这里之需要通过一条简单的命令可以创建SQLite数据库。需要修改在settings里面,默认为sqlite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
创建数据库:
切换到含有manage.py的目录下:
python manage.py makemigrations
python manage.py migrate
4.后台管理
django默认开启了admin的后台:
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
终端输入:python manage.py runserver开启服务(再价一个参数可以设置端口号)
访问 http://127.0.0.1:8000/admin 访问后台
需要管理员密码账号:
终端输入:
python manage.py createsuperuser
根据提示创建即可。
五.修改数据库内容,添加其他项。
在最后添加一行代码:
admin.site.register(BlogPost)
前面添加:
from django.contrib import admin
这样就多了一个BlogPost的项了
Add–>添加文章,就能开始写文章了。
然后再对后台界面做个优化,让文章的标题时间显示出来‘
修改blog应用的models.py,为它添加一个admin.ModelAdmin的子类BlogPostAdmin.以列表形式显示BlogPost的标题和时间。
完整代码:
from django.db import models
from django.contrib import admin
# Create your models here.
class BlogPost(models.Model):
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title','timestamp')
admin.site.register(BlogPost,BlogPostAdmin)
六.把后台博客优雅的显示到前台去
blog下面新建一个templates文件夹,这里可以放置各种资源,会默认找到这里。
在templates下新建一个模板页面。muban.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的博客title>
head>
<body>
{% for post in posts %}
<h2>{{ post.title }}h2>
<p>{{ post.timestamp }}p>
<p>{{ post.body }}p>
{% endfor%}
body>
html>
其中{{ }}里面包含的是要显示的变量,使用一个for循环把文章全部显示在页面上。
视图blog/views
里面包含要显示的页面方式。
在这里调用模板并且传入参数:
from django.shortcuts import render
from django.template import loader,Context
from django.http import HttpResponse
from blog.models import BlogPost
# Create your views here.
def muban(request):
posts = BlogPost.objects.all()
t = loader.get_template("muban.html")
c = Context({'posts':posts})
return HttpResponse(t.render(c))
现在还是不能显示博客页面,因为请求首先是在mysite/urls里面处理的,
所以要添加一个url到blog的views里面去。
from django.conf.urls import url
from django.contrib import admin
from blog import views as blog_views # new
urlpatterns = [
url(r'^blog', blog_views.muban, name='muban'), # new
url(r'^admin/', admin.site.urls),
]
打开服务,访问http://127.0.0.1:8000/blog/
七.美化界面
mysite/blog/templates目录里创建一个叫base.html的模板
Title
my blog
{% block content %}
{% endblock %}
继承模板:
muban.html
{% extends "base.html" %}
{% block content %}
{% for post in posts %}
{{ post.title }}
{{ post.timestamp | date:"1,F jS"}}
{{ post.body }}
{% endfor %}
{% endblock %}
按日期排序
修改blog 应用下的models.py,为BlogPost添加一个Meta嵌套类。如下:
class BlogPost(models.Model):
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()
class Meta:
ordering = ('-timestamp',)