初学python和django,看过Learn python the hard way和the django book前八章后,决定做一个简单的blog页面来实战下,以此作为正式学习python和django的开始。写完代码之后顺便来点自己的学习总结,同时也可以给初学的童鞋们做个参考,也算是有始有终吧。
本博客采用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 Article的content采用了UEditorField字段类型。这里采用了百度Ueditor富文本编辑器,便于输入各种样式的博文内容。具体的安装和使用可以参考:https://github.com/zhangfisher/DjangoUeditor。另外每个class都有一个__unicode__( )方法来返回一些属性,便于利用admin进行管理,否则admin中显示的对象都是诸如<Category object>之类的。Class Article和Comment的createtime字段中的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="内容",)
定义了一个评论表单类,包括评论者的name和email(必要时可以方便联系),以及评论的具体内容等属性,非常简单。
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. 博文详细页面:根据Article的id来获得数据库中对应的文章的信息。“顶”和“踩”的功能和评论功能在提交对应表单时需要更改服务器数据库的状态,因此需要使用request.POST,关于403错误,可以参考http://blog.sina.com.cn/s/blog_75e9551f01017lkt.html。
模板和css
配置好URL后,就剩下模板文件了。网页的头、尾和侧栏是不变的,因此可以用模板继承的办法来避免重复的代码。然后利用 DIV+CSS来控制网页呈现的样式,为了简约时间只是简单地写了下。
部分截图:
运行设置
为了方便运行脚本,查看效果,我把代码稍微改了下,按照以下步骤操作即可:
1. 下载压缩文件解压缩后,直接将manage.py外面的那个myblog文件夹,拷贝到C盘根目录下,省得修改目录。
2. C:/myblog/myblog/settings.py中的第13行DATABASE部分请根据自己的实际情况修改。然后新建一个数据库,名字与DATABASE的’NAME’相对应。
3. 创建数据库表格。打开cmd, cd到 C:/myblog依次运行
python manage.py validate
python manage.py sqlall blog
python manage.py syncdb
这里会让你创建一个超级用户,这里设置的用户名和密码可以登陆admin
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/发表博客。
代码下载地址
代码下载地址:我是代码,有兴趣的可以看看,如有任何问题,可在评论中给我留言。