使用django搭建简单的博客程序(一)

2013年5月22日 | 分类: Network, Python | 标签: ,

  谨此反思总结两周的博客开发经历……当然,事实上,我在写这篇文章的时候这个项目还没有彻底完成,有一些(或者说很多)收尾的工作要做,嘛,反正也就那样。

  项目地址在SBlog,其实我也有些困扰是否需要展示出来,毕竟很简陋,代码也一团糟,正如名字所显示的,整个程序既是Simple的,也是Stupid的……但是不管怎么说,作为自己写的第一个webapp,还是挺有纪念价值的。

  同时必须说明的是,这东西真是不需要懂前端后台的,因为我就不太懂。django的话,也不需要懂,大致能安装好的程度也许就够了?所以,严重初心者向,大神请绕行或者果断提出批评意见。还有,因为在写这个东西之前,我连html都不会,jsp更抓瞎,所有很多地方用到了插件,不习惯或者不喜欢插件流的,恐怕也不太适合。上个月我针对django写了点文章,现在看上去基本是胡说,当作笑话或者黑历史去看别有一番风味。

  写程序的时候,参看了不少人写的代码,主要有:

  vicalloy氏的DPress

  ichuan氏的djblog

  goodspeedcheng氏的sblog

  特别一提,goodspeedcheng氏对于博客程序的写作有相当不错的心得,编码水平也远优于笔者,特别推荐 django简易博客开发1,其文受益良多。

  以上。

 

  本文假定您已经安装好了django,并且环境配置无误,具体可以看一下goodespeedcheng氏的博文。

  这一篇的主要目的是做一个最简单的blog原型,后来的修改,都基于这个原型。

  首先是使用django-admin.py构建一个项目,这将会成为后来所有应用的根。

   

  django-admin.py startproject blog

 

  本文的项目使用名字是blog,你也可以用自己喜欢的项目名。

  运行这个命令会生成一个文件夹,进去之后应该会看到一个嵌套的结构—里面还有一个和项目同名的文件夹。

  cd 到项目目录,使用 python manage.py runserver 确定没有出现差错。

  使用下面的指令创建一个应用(app)。一个应用也是一个文件夹。其实就个人来说,对应用认识也不是很深刻,大致明白应用提供了一种与项目之间清晰而且松耦合的关系,随时可以通过INSTALL_APPS来挂载不同的应用。对于这个简单的程序而言,我们不需要多个应用。

   

  python manage.py startapp SBlog

 

  同样的,可以用自己喜欢的名字。

  使用自己喜欢的编辑器打开 项目名/settings.py ,由于我的项目名是blog,应用名是SBlog,后面会直接用blog和SBlog指代,不再说明。我的编辑器是vim,后面也不再说明。

  一个web应用,最重要的是数据库,这个讨论起来比较麻烦,所以,我假设做到这一步的时候,你已经设置好了数据库……具体的,在settings.py中设置,个人的数据库使用mysql,推荐使用PostgreSQL。这部分官方文档说得很详细。官方文档。请着重阅读 Database setup一节。虽然本机测试可以,但是个人不推荐使用SQLite……

  当然,设置好了数据库,不要忘了为这个项目增加一个Database,相信你已经做好了。

  后台管理页面太麻烦了,不想写!没问题,因为我也这样想。django的突出优势之一就是有一个相当好的admin管理界面,你只需要解开注释就能用。看一下你的blog/settings.py中,INSTALLED_APPS中django.contrib.auth 以及 django.contrib.admin 项是否解开了注释,恩,我忘了默认有没有注释了……

  同步数据库吧,这次同步会为你把刚才添加的admin的相关表项建立好。

  运行runserver,你会发现依然没法访问管理界面,原因是你没有设置url路径,不为一个应用指定路径,当然不可能访问这个应用。

vim blog/urls.py

  我记得里面有提示说 Uncomment next two for admin 什么的……忘了,反正找到(r’^admin/’ xxxxxxxx)那行就好了,解开注释,于是就可以通过 127.0.0.1:8000/admin/ 路径去访问admin管理界面了。

  怎么创建博文?通常,你需要在一个界面填写 title,content,abstrct,之类的,现在问题是,怎么创建这个界面。

  admin有相当完善的一套机制,具体的说,你只需要 admin.site.register(xxx)就好了。xxx是一个model类,里面的每一条属性都会对应生成一个输入框(其实也不是每一条,可以通过指定某些参数来控制不显示,挺麻烦的)。

  光说恐怕不太靠谱,实际做起来的话,相当一目了然。不过在此之前,请把你的app添加进settings.py。比如,我的是SBlog,把这个添加进settings.py中的INTALLED_APPS,就像这样:

 

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'SBlog',
)

 

  由于是元组,逗号什么的还是挺重要的,不能漏的。

  之所以把SBlog添加进去,是因为我们马上就要用SBlog这个app了,当然直接用是没用的,我们需要修改它。

  用vim打开SBlog/models.py,删掉里面所有的内容—-不是因为他们不重要,而是你直接用我下面写的就行的……

  下面的指定了博文撰写页面的各个表单项。

 

# coding:utf-8
from django.db import models
from django.contirb import admin

class Post(models.Model):
    '''文章'''
    title = models.CharField(max_length=200,verbose_name=u'标题')
    author = models.CharField(default="AprocySanae",max_length=100,verbose_name=u'作者')
    slug = models.SlugField(max_length=100,verbose_name=u'Slug',help_text = u'本文的短标题,将出现在文章的url中')
    archive = models.CharField(max_length=100,verbose_name=u'归档标签',help_text = u'用于给文章分类,比如博客,心情什么的')
    count_hit = models.IntegerField(default=0,editable=False,verbose_name=u'点击数')
    content = models.TextField(verbose_name=u'内容')
    abstract = models.TextField(verbose_name=u'摘要')
    timestamp = models.DateTimeField(u'编辑时间',auto_now=True)
    allow_comment = models.BooleanField(default = True,verbose_name='允许评论')

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

    def get_absolute_url(self):
        return u'/articles/%s' % self.slug

    class Meta:
        ordering = ['-id']
        verbose_name_plural = verbose_name = u'文章' 

 

  再在SBlog中新建一个admin.py,输入下面的:

from django.contrib import admin
from SBlog.models import Post

##class PostAdmin(admin.ModelAdmin):
##    search_fields = ('title','archive')
##    list_display = ('title','author','archive','timestamp')
admin.site.register(Post)
##admin.site.register(Post,PostAdmin)

 

  上面那个注释了不少东西,那个,等会同步过数据库了之后可以解开看看,那个是用来规定显示样式的。

  顺便说一下,默认的,admin.site.register(Post)应该是写在models.py的,但是我总觉得这样会比较乱,所以直接放到admin.py里了。

  总之,运行 python manage.py syncdb吧,然后看看你的127xxxx/admin 里面是不是多了一个Post的玩意,点开,你会发现,你能增加文章了。如果不正确,先看看是不是有没做到的地方,然后可以给我发邮件 axdiaoqi220@gmail.com 毕竟我也有可能有东西没写道……那时候,最好的方法是google或者官方文档。

  现在后台就结束了,写个简单的前端页面吧。

  在blog项目(注意)文件夹,建立一个叫templates的文件夹。然后修改settings.py,更改其中的TEMPLATE_DIRS项,使用绝对路径把template文件夹添加上去,一定是绝对路径。比如我的就是 /home/aprocysanae/blog/temlates 记住最后的逗号。

  在temlates文件夹中,建立一个home.html—本身这个是随意取的名字,这里叫什么不重要,但是后面引入视图函数的时候会用到。

  里面添加这些代码:

 

{% for post in posts %}
《h2》{{ post.title }}《/h2》
《p》{{ post.timestamp }}《/p》
《p》{{ post.content }}《/p》

 

  由于我不懂html,就只用最简单的就好了……事实上,你可以不止用这些东西,post类里面所有的属性都可以。

  大括号里面是数据,理所当然,这些得从外面传递进来值才行。

  处理这个页面的,叫做view,视图函数。

  打开SBlog.views.py

  然后输入这个来处理:

# coding=utf-8

from SBlog.models import Post
from django.template import loader,Context
from django.http import HttpResponse

def home(request):
    posts = Post.objects.all()
    t = loader.get_template('home.html')
    c = Context({ 'posts':posts})
    return HttpResponse(t.render(c))

  上面那个从数据库获取了所有的Post,然后传给了页面。

 

  前面我们知道了,没有指明路径就不可能被访问到,所以需要添加路径。

  vim blog/urls.py

  然后里面添加一个路径 url(r’^$’,home)

  再添加一个引用:

  from SBlog.views import home

  就可以了。如果没错的话,应该是我这样。

 

from django.conf import settings
from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
from SBlog.views import home

admin.autodiscover()

urlpatterns = patterns('',
        url(r'^$',home),
        url(r'^admin/',include(admin.site.urls)),

 

  不一样或者大致差不多应该没什么问题,特别是import部分,因为我忘了哪些是原本的了……

  然后嘛,就没有然后了……运行runserver,应该会看到一个惨不忍睹的页面,不过能看到就是好事……还是那句话,如果是一片调试信息,有可能是我的问题,记性不太好,忘了哪里也是说不准的。反正,最重要的几个东西:models.py 对应数据库,urls.py 对应路径,views.py对应把后台数据传到前台的桥的功能,template里面是前台页面,就这样。

  这不是django的语法说明,网上有本django book 2.0 已经翻译好了的,好好看看前六章,就能看懂大部分了。多折腾折腾,就能琢磨出来了,都是折腾出来的。

  下一篇着重讲,如何用bootstrap使前台界面更好看……

 

 

 

  1. 2013年5月22日15:43

    同样注意,这里的编译器没法识别尖括号,我用中文的书名号代替了。书名号替换成尖括号过去就好了

  2. flysand
    2014年3月5日14:37

    文章中的代码发现3个错误。
    1、models.py中from django.contirb import admin的contrib拼写错了;
    2、home.html中最后缺少一行{% endfor %};
    3、home.html中尖括号应该为英文字符。

    我是新手,按照你的文章实验中发现的错误,希望文章中的错误不要给其他还没入门的朋友带来困惑。
    感谢你的博文,对我非常有用,谢谢!