django简单博客搭建

初学pythondjango,看过Learn python the hard waythe django book前八章后,决定做一个简单的blog页面来实战下,以此作为正式学习pythondjango的开始。写完代码之后顺便来点自己的学习总结,同时也可以给初学的童鞋们做个参考,也算是有始有终吧。

本博客采用python2.7.6 + django1.5.5 + MySQL5.6搭建而成,具体安装和设置可以参考the django book。友情提醒,所有软件的位数最好一致以免出现各种问题。

总体思路:

1. 利用django现成的Admin功能来发表、管理博客,只需设计博客浏览部分。

2. 博客浏览主要包括三个页面:

(1)首页:显示几篇最近更新的博文摘要

(2)博文目录页面:显示所有博文的题目等信息,包括按类别或搜索关键字浏览

(3)博文详细页面:显示博文的具体信息和内容,包括“顶”、“踩”和评论功能

models.py

#-*- coding:utf-8 -*-

from django.db import models
import time
from DjangoUeditor.models import UEditorField

#文章分类
class Category(models.Model):
    name = models.CharField(max_length=100)
    article_num = models.IntegerField(default=0)

    def __unicode__(self):
        return u'%s' % self.name       


#文章
class Article(models.Model):
    category = models.ForeignKey(Category)
    caption = models.CharField(max_length=200)
    shortcontent = models.TextField(max_length=500)
    content = UEditorField('content')
    createtime=models.DateTimeField(auto_now_add=True)
    hits = models.IntegerField(default=0)
    times = models.IntegerField(default=0)
    goods = models.IntegerField(default=0)
    bads = models.IntegerField(default=0)
    def __unicode__(self):
        return u'%s' % self.caption

    
#评论
class Comment(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    content = models.TextField()
    createtime=models.DateTimeField(auto_now_add=True)
    article = models.ForeignKey(Article)

    def __unicode__(self):
        return u'%s' % self.article

包括文章分类、文章和评论三个部分。值得注意的是class Articlecontent采用了UEditorField字段类型。这里采用了百度Ueditor富文本编辑器,便于输入各种样式的博文内容。具体的安装和使用可以参考:https://github.com/zhangfisher/DjangoUeditor。另外每个class都有一个__unicode__( )方法来返回一些属性,便于利用admin进行管理,否则admin中显示的对象都是诸如<Category object>之类的。Class ArticleCommentcreatetime字段中的auto_now_add=True则能在创建对象的时候自动添加时间日期。

admin.py

#-*- coding:utf-8 -*-

from django.contrib import admin
from blog.models import *

class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'article_num')

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('caption', 'category', 'createtime', 'hits', 'times', 'goods', 'bads')
        
class CommentAdmin(admin.ModelAdmin):
    list_display = ('article', 'content', 'createtime', 'name', 'email')
    
admin.site.register(Category, CategoryAdmin)
admin.site.register(Article, ArticleAdmin)
admin.site.register(Comment, CommentAdmin)

为了方便在admin中管理博客,需要将models.py中的三个数据模型添加到admin管理中,这里使用了ModelAdmin类来自定义管理页面,具体可参考the django book第六章。

forms.py

#-*- coding:utf-8 -*-
from django import forms

class CommentForm(forms.Form):
    name = forms.CharField(label="姓名")
    email = forms.EmailField(required=False, label="邮箱")
    content = forms.CharField(widget=forms.Textarea, label="内容",)

定义了一个评论表单类,包括评论者的nameemail(必要时可以方便联系),以及评论的具体内容等属性,非常简单。

Views.py

#-*- coding:utf-8 -*-

from django.template import loader, Context, RequestContext
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.paginator import Paginator,InvalidPage,EmptyPage,PageNotAnInteger
import time
import datetime
from django.db.models import Q
from django.db import connection
import Common,os
import models
from forms import CommentForm
        
#侧栏
def r_sidebar(request):
    
    categorys = models.Category.objects.order_by('-id')
    articles = models.Article.objects.all()
    
    # 计算每类的文章数目
    for category in categorys:
        category.article_num = 0
        for article in articles:
            if article.category == category:
                category.article_num += 1
        category.save()
    
    return categorys 
    
#首页
def default(request):

    categorys = r_sidebar(request)
    articles = models.Article.objects.order_by('-id')[0:6]
    return render_to_response('index.html',locals())

#博文目录
def article_list(request):

    categorys = r_sidebar(request)
    keywords = request.GET.get('keywords')
    category = request.GET.get('category')
    
    #根据搜索、分类和默认确定对应的文章
    if keywords:
        articles = models.Article.objects.order_by('-id').filter(Q(caption__icontains=keywords) | Q(content__icontains=keywords))    
    elif category:
        articles = models.Article.objects.order_by('-id').filter(category__id=int(category))            
    else:
        articles = models.Article.objects.order_by('-id')   
    
    #分页
    paginator = Paginator(articles,20)
    
    #确定某页的文章
    try:
	    page = int(request.GET.get('page',1))
	    if page < 1:
		    page = 1
    except ValueError:
        page = 1   
    
    try:
	    articlelist = paginator.page(page)
    except(EmptyPage,InvalidPage,PageNotAnInteger):
	    articlelist = paginator.page(1)

    #页数太多时,页数范围确定为当前页码的前后几页 
    after_range_num = 3
    before_range_num = 2
    
    if page >= after_range_num:
	    page_range = paginator.page_range[page - after_range_num:page + before_range_num]
    else:
	    page_range = paginator.page_range[0:page + before_range_num]

    return render_to_response('article_list.html',locals())
        
#文章详细页面
def article_detail(request):  

    categorys = r_sidebar(request)
    
    #根据id获取文章信息
    articleid = int(request.GET.get('article'))
    article = models.Article.objects.get(id = articleid)

    #更新浏览次数
    article.hits += 1

	#显示评论
    commentlist = models.Comment.objects.filter(article_id = articleid)
    
    #顶和踩
    if request.POST.has_key('good'):
        article.goods += 1
    
    if request.POST.has_key('bad'):
        article.bads += 1
    
    #提交评论
    if request.POST.has_key('commentsubmit'):
  
        formInfo = CommentForm(request.POST)
        if formInfo.is_valid():
            submiterror = 0
            comment = formInfo.cleaned_data
            models.Comment.objects.create(name=comment['name'], content=comment['content'], article=article, email=comment['email'])
            article.times += 1
        else:
            submiterror = 1
        

    article.save()
    form = CommentForm()
    
    return render_to_response('article_detail.html',locals(),context_instance=RequestContext(request))

1. 侧栏:侧栏显示博文分类和对应的文章数。由于博文的发表是在admin界面完成的,每类博文的文章数目我不知道如何在发表文章时自动加一,干脆粗鲁地利用for循环每次都计算一遍各个category中的article_num然后利用category.save()保存到数据库中。

2. 首页:显示最新发表的6篇博文的信息。

3. 博文目录:默认显示所有博文的列表,同时也支持keywords搜索和category分类。另外,利用Paginator函数来实现分页。关于Paginator函数的具体用法,可以参考http://blog.csdn.net/zouyee/article/details/16997949

4. 博文详细页面:根据Articleid来获得数据库中对应的文章的信息。“顶”和“踩”的功能和评论功能在提交对应表单时需要更改服务器数据库的状态,因此需要使用request.POST,关于403错误,可以参考http://blog.sina.com.cn/s/blog_75e9551f01017lkt.html

模板和css 

配置好URL后,就剩下模板文件了。网页的头、尾和侧栏是不变的,因此可以用模板继承的办法来避免重复的代码。然后利用 DIV+CSS来控制网页呈现的样式,为了简约时间只是简单地写了下。

部分截图:

django简单博客搭建_第1张图片

django简单博客搭建_第2张图片

django简单博客搭建_第3张图片

django简单博客搭建_第4张图片

运行设置

为了方便运行脚本,查看效果,我把代码稍微改了下,按照以下步骤操作即可:

1. 下载压缩文件解压缩后,直接将manage.py外面的那个myblog文件夹,拷贝到C盘根目录下,省得修改目录。

2. C:/myblog/myblog/settings.py中的第13DATABASE部分请根据自己的实际情况修改。然后新建一个数据库,名字与DATABASE’NAME’相对应。

3. 创建数据库表格。打开cmd cd C:/myblog依次运行

python manage.py validate

django简单博客搭建_第5张图片

python manage.py sqlall blog

django简单博客搭建_第6张图片

python manage.py syncdb 

django简单博客搭建_第7张图片

这里会让你创建一个超级用户,这里设置的用户名和密码可以登陆admin

django简单博客搭建_第8张图片

4. 运行python manage.py runserver启动开发服务器,浏览器输入http://127.0.0.1:8000/blog/

就能看到彩色页面了。如果黑白的话建议修改C:\myblog\themes\default\templates\base.html

13行,将href改成绝对路径"C:/myblog/themes/default/style.css"

5. 进入 http://127.0.0.1:8000/admin/发表博客。

代码下载地址

代码下载地址:我是代码,有兴趣的可以看看,如有任何问题,可在评论中给我留言。


你可能感兴趣的:(django,python,博客搭建)