[翻译]如何使用Django创建简单的博客

最近在学习Django,看到一篇不错的入门教程,小译一下,想学习Django的新手朋友们可以凑合看看。

原文链接:How to create a basic blog in Django

Django可以做的事情有很多,作为入门,我认为这是学习Django的一个好的开始。

Notes

首先你要自己部署Django的开发服务器,或者是 apache/lighttpd,如果还没有Django的环境请先部署好环境。 本次的这个博客程序只是作为一个例子,运行在真实环境中可能还是有一些未知的问题和不足的功能,有问题也请大家指出来,我好加以改进。

第一节:开始(Starting your application)

进入到你的项目目录中,这个目录中应该包含这几个文件 __init__.pymanage.pysettings.pyurls.py 。我的 project 名字是 djangorocks,如果你要用到其他名字,你需要在以后的代码中替换所有 djangorocks。

在终端(terminal)中输入以下命令,来创建新的app目录和几个基本文件,以便我们的博客使用。

python manage.py startapp blog

现在你应该有个文件夹下面包含这三个文件 __init__.py , models.pyviews.py

Important

打开project文件夹中的 settings.py ,找到 INSTALLED_APPS 并添加 “blog” ,代码如下:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'djangorocks.blog',
)

Django现在已经知道你有一个新的app,下面的事情就是详细地来创建它。

第二节:定义你的模型(Defining your models)

这个模型也就是你的数据库结构,让我们打开 app 目录中的 models.py,然后加入一些字段,因为这个非常简单,我将不会包含用户。

class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    body = models.TextField()
    posted = models.DateField(db_index=True, auto_now_add=True)
    category = models.ForeignKey('blog.Category')

class Category(models.Model):
    title = models.CharField(max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, db_index=True)

现在我们来看看上面这段代码中每个部分分别代表什么意思

这将在数据库中创建一张名字为”Blog”的表,这是显而易见的,以后也会常用。

classBlog(models.Model):

这些都是要建立在数据库中的基本字段

title = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(max_length=100, db_index=True)
body = models.TextField()
posted = models.DateTimeField(db_index=True, auto_now_add=True)

最后一个字段要稍微高级点,此字段的数据是从另一个表而来,也就是我们一般说的外键,具体可参考 SQL FOREIGN KEY 约束

category = models.ForeignKey('blog.Category')

模型构建完成

这里还有一些东西需要添加到Model中,下面是你完成的模型文件内容。

from django.db import models
from django.db.models import permalink

# Create your models here.

class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    body = models.TextField()
    posted = models.DateTimeField(db_index=True, auto_now_add=True)
    category = models.ForeignKey('blog.Category')

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

    @permalink
    def get_absolute_url(self):
        return ('view_blog_post', None, { 'slug': self.slug })

class Category(models.Model):
    title = models.CharField(max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, db_index=True)

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

    @permalink
    def get_absolute_url(self):
        return ('view_blog_category', None, { 'slug': self.slug })

这些有什么用?

__unicode__ 函数为每条记录设置文本引用。主要用于自动化的Django admin,但也可以用在我们自己的网站

get_absolute_url 函数定义了一个URL,为每条记录用在管理区域

没有 “ permalink “ 装饰的话将不会工作。这是从py文件返回一个URL,很快就会解释计算。我会推荐使用这种方法,因为它允许你改变一个页面的URL只在一个位置。

return ('view_blog_post', None, { 'slug': self.slug })

例子

标题:如何使用Django创建简单的博客

__unicode__ 响应:如何使用Django创建简单的博客

get_absolute_url 响应:/blog/view/how-to-create-a-basic-blog-in-django.html

这个例子的局限性

每篇文章有一个slug字段,用来作为URL识别,在这种情况下,博客的title和slug是唯一的,两个相同标题的文章是不合理的,为了解决这个问题你可以设置 slug 字段类似 2-my-second-post

这个例子允许文章只有一个类别,这是通过添加多对多的字段而不是 ForeignKey,这样你使用这个有一点点的不同,所以不会有其他太大的变化。

第三节:配置自动化后台(Configuring the automatic admin)

… 休息下,未完待续