5.16-使用Django搭建个人博客

使用Django创建简易的个人博客


本文开发环境:
  1. django == 1.8.3
  2. ubantu == 16.04
  3. python == 2.7.12

安装

sudo pip install django==1.8.3

创建项目

django-admin startproject tutorial
cd tutorial
python manage.py startapp blog

数据迁移
python manage.py migrate
python manage.py runserver

访问: http://127.0.0.1:8000
启动成功。

创建模型blog:models

#coding:utf8
from __future__ import unicode_literals
from django.db import models

# 创建模型类

class Article(models.Model):
title = models.CharField(u"博客标题",max_length = 100)        #博客标题
category = models.CharField(u"博客标签",max_length = 50,blank = True)       #博客标签
pub_date = models.DateTimeField(u"发布日期",auto_now_add = True,editable=True)       #博客发布日期
update_time = models.DateTimeField(u'更新时间',auto_now=True,null=True)
content = models.TextField(blank=True, null=True)  # 博客文章正文

def __unicode__(self):
    return self.title

class Meta:     #按时间下降排序
    ordering = ['-pub_date']
    verbose_name = "文章"
    verbose_name_plural = "文章"

同步数据库:

    python manage.py makemigrations
    python manage.py migrate

后台管理页面:

创建超级用户:

    python manage.py createsuperuser
    分别有user password  email  用户自定义填写。

在blog:admin 中注册

#coding:utf8
from django.contrib import admin
from blog.models import Article
# Register your models here.

class ArticleAdmin(admin.ModelAdmin):
	list_display = ('title','pub_date')
	
admin.site.register(Article,ArticleAdmin)

运行项目:

python manage.py runserver

修饰界面以及更改为中文

首先我们先安装一个bootstrap的插件

(sudo) pip install bootstrap-admin

然后在tutorial/settings.py中更改一些代码

INSTALLED_APPS = (
'bootstrap_admin',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
和
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

此时登录admin界面,界面转化为中文字样。

集成 DjangoUeditor 编辑器及静态文件的处理

https://github.com/twz915/DjangoUeditor3
可以下载zip或者直接clone,将里面的DjangoUeditor直接放到本项目的根目录

ls  # 第二行为显示的为此文件包中的内容
blog  db.sqlite3  DjangoUeditor  manage.py  README.md  templates  tutorial

并且在settings中加入此插件应用。

INSTALLED_APPS = (
...
  
'blog',
'DjangoUeditor',
)

在tutorial:url中

from django.conf.urls import include, url
from django.contrib import admin
from DjangoUeditor import urls as djud_urls
from django.conf import settings

urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^ueditor/',include(djud_urls)),
]

if settings.DEBUG:
	from django.conf.urls.static import static
	urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

上方这是为了让django能访问编辑器模块

然后在tutorial/settings.py中加入

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')

#公共的static文件
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"common_static"),
os.path.join(BASE_DIR,"media"),
)

#upload floder
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

STATICFILES_FINDERS = ("django.contrib.staticfiles.finders.FileSystemFinder",
                   "django.contrib.staticfiles.finders.AppDirectoriesFinder",)

其中:

STATIC_URL 这个是放置静态文件的地方,
django会默认在这个文件夹中寻找需要的静态文件,
很多教程教大家上来就把静态文件塞这里面其实这并不是一个好的处理方法,
因为在发布前需要统一收集静态文件的时候会从各个文件夹中收集静态文件放入这个文件夹中,
期间有可能会覆盖掉原来的文件。

STATIC_ROOT 这个就是静态文件相对于系统的目录

MEDIA_URL 一般会将上传的文件放入这个文件夹

MEDIA_ROOT 同STATIC_ROOT

STATICFILES_DIRS 这一个元组,里面放置开发时静态文件自动搜寻的目录,
	我们在开发是先建一个common_static即公用的静态文件夹,
	在里面放我们自己的静态文件,等最后使用静态文件收集命令一并处理。

然后我们更改blog/models.py 中的模型

from DjangoUeditor.models import UEditorField


content = UEditorField(u"文章正文",height=300,width=1000,default=u'',blank=True,imagePath="uploads/blog/images/",
                       toolbars='besttome',filePath='uploads/blog/files/')

迁移数据库:

python manage.py makemigrations
python manage.py migrate

views和urls

我们在blog/views.py中加入:

def Test(request):
return HttpResponse("just a test")

在blog中添加urls.py

#coding:utf8
from django.conf.urls import url
from . import views

urlpatterns = [
	url(r'^test/',views.Test,name="blog_test"),
]

在tutorial的urls中引入blog的urls:

import blog.urls as blog_url

urlpatterns = [
	url(r'^blog/',include(blog_url)),
	url(r'^admin/', include(admin.site.urls)),
	url(r'^ueditor/',include(djud_urls)),
]

运行后可以正常访问,返回just a test。
我们尝试着通过视图views访问数据库,更改/blog/views.py:

from blog.models import Article

def Test(request):
	post = Article.objects.all()
	return HttpResponse(post[0].content)

如果你刚在后台添加了文章那么就能看到它了。

使用Template来展示界面

在项目目录下有一个名叫templates的文件夹,如果没有你就建一个。
新建一个html文件templates/blog/test.html:

<!DOCTYPE html>
<html>
	<head>
    	<title>Just test template</title>
    	<style>
        	body {
           		background-color: red;
       				 }
        		em {
            		color: LightSeaGreen;
       				 }
   		 </style>
</head>
<body>
    <h1>Hello World!</h1>
   		<strong>{{ current_time }}</strong>
</body>
</html>

修改blog:views.py :

def Test(request) :
	return render(request, 'blog/test.html',
				 {'current_time': datetime.now()})

新建3个html放入templates、blog中:

base.html:

<!doctype html>
<html lang="zh-hans">
<head>
	<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="A layout example that shows off a blog page with a list of posts.">
<title>李琼羽的博客</title>
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.5.0/pure-min.css">
<link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.5.0/grids-responsive-min.css">
<link rel="stylesheet" href="http://picturebag.qiniudn.com/blog.css">
</head>
<body>
<div id="layout" class="pure-g">
<div class="sidebar pure-u-1 pure-u-md-1-4">
    <div class="header">
        <h1 class="brand-title"><a href="{% url 'blog_home' %}">Angelo Li Blog</a></h1>
        <h2 class="brand-tagline">李琼羽 - Angelo Li</h2>
        <nav class="nav">
            <ul class="nav-list">
                <li class="nav-item">
                    <a class="button-success pure-button" href="/">主页</a>
                </li>
                <li class="nav-item">
                    <a class="button-success pure-button" href="/">归档</a>
                </li>
                <li class="nav-item">
                    <a class="pure-button" href="/">Github</a>
                </li>
                <li class="nav-item">
                    <a class="button-error pure-button" href="/">微博</a>
                </li>
                <li class="nav-item">
                    <a class="button-success pure-button" href="/">专题</a>
                </li>
                <li class="nav-item">
                    <a class="button-success pure-button" href="/">About Me</a>
                </li>
            </ul>
        </nav>
    </div>
</div>


<div class="content pure-u-1 pure-u-md-3-4">
    <div>
        {% block content %}
        {% endblock %}
        <div class="footer">
            <div class="pure-menu pure-menu-horizontal pure-menu-open">
                <ul>
                    <li><a href="/">About Me</a></li>
                    <li><a href="/">微博</a></li>
                    <li><a href="/">GitHub</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>
</div>

</body>
</html>

home.html

{% extends "blog/base.html" %}
{% block content %}
<div class="posts">
{% for post in post_list %}
    <section class="post">
        <header class="post-header">
            <h2 class="post-title"><a href="{% url 'blog_detail' id=post.id %}">{{ post.title }}</a></h2>

                <p class="post-meta">
                    Time:  <a class="post-author" href="#">{{ post.date_time |date:'Y /m /d'}}</a> <a class="post-category post-category-js" href="#">{{ post.category }}</a>
                </p>
        </header>

            <div class="post-description">
                <p>
                    {{ post.content|safe }}
                </p>
            </div>
            <a class="pure-button" href="{% url 'blog_detail' id=post.id %}">Read More >>> </a>
    </section>
{% endfor %}
</div><!-- /.blog-post -->
{% endblock %}

post.html

{% extends "blog/base.html" %}

{% block content %}
<div class="posts">
{% for post in post_list %}
    <section class="post">
        <header class="post-header">
            <h2 class="post-title"><a href="{% url 'blog_detail' id=post.id %}">{{ post.title }}</a></h2>

                <p class="post-meta">
                    Time:  <a class="post-author" href="#">{{ post.date_time |date:'Y /m /d'}}</a> <a class="post-category post-category-js" href="#">{{ post.category }}</a>
                </p>
        </header>

            <div class="post-description">
                <p>
                    {{ post.content|safe }}
                </p>
            </div>
            <a class="pure-button" href="{% url 'blog_detail' id=post.id %}">Read More >>> </a>
    </section>
{% endfor %}
</div><!-- /.blog-post -->
{% endblock %}

其中,home.html和post.html继承于base.html

更改blog/views.py:

#coding:utf8

from django.shortcuts import render
from django.http import HttpResponse
from blog.models import Article
from datetime import datetime
from django.http import Http404

# Create your views here.

def home(request):
	post_list = Article.objects.all()  # 获取全部的Article对象
	return render(request, 'blog/home.html', {'post_list': post_list})

def Test(request):
	return render(request,'blog/test.html',{'current_time': datetime.now()})

def Detail(request,id):
	try:
   		post = Article.objects.get(id=str(id))
	except Article.DoesNotExist:
    	raise Http404
	return render(request,'blog/post.html',{'post':post})

blog/urls.py

#coding:utf8
from django.conf.urls import url
from . import views

urlpatterns = [
	url(r'^post/(?P<id>\d+)/$',views.Detail,name="blog_detail"),
	url(r'^home/',views.home,name="blog_home"),
	url(r'^test/',views.Test,name="blog_test"),
]

tutorial/urls.py

from django.conf.urls import include, url
from django.contrib import admin
import blog.urls as blog_url
from DjangoUeditor import urls as djud_urls
from django.conf import settings

urlpatterns = [
	url(r'^blog/',include(blog_url)),
	url(r'^admin/', include(admin.site.urls)),
	url(r'^ueditor/',include(djud_urls)),
]

if settings.DEBUG:
	from django.conf.urls.static import static
	urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

运行访问http://127.0.0.1:8000/blog/home/

使用uWSGI+nginx部署Django项目

详细步骤见http://www.cnblogs.com/Liqiongyu/articles/5893780.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值