最近在学习 Django,看到一篇不错的入门教程,小译一下,想学习 Django 的新手朋友们可以凑合看看。
原文链接:How to create a basic blog in Django
Django 可以做的事情有很多,作为入门,我认为这是学习 Django 的一个好的开始。
Notes
首先你要自己部署 Django 的开发服务器,或者是
apache/lighttpd
,如果还没有 Django 的环境请先部署好环境。 本次的这个博客程序只是作为一个例子,运行在真实环境中可能还是有一些未知的问题和不足的功能,有问题也请大家指出来,我好加以改进。
第一节:开始(Starting your application)
进入到你的项目目录中,这个目录中应该包含这几个文件 __init__.py
, manage.py
, settings.py
和 urls.py
。我的 project 名字是 djangorocks,如果你要用到其他名字,你需要在以后的代码中替换所有 djangorocks。
在终端(terminal)中输入以下命令,来创建新的 app 目录和几个基本文件,以便我们的博客使用。
python manage.py startapp blog
现在你应该有个文件夹下面包含这三个文件 __init__.py
, models.py
和 views.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)
… 休息下,未完待续