django 博客一

来源:互联网 发布:澳门网络博客骗局 编辑:程序博客网 时间:2024/05/21 19:34

最近要做一个网站,语言为python,框架使用Django。

之前由于没接触过python,所以又找了些python的书来看。感觉python的确是门不错的编程语言。

当然,重点还是Django。学习时,我主要参考了官方文档,和一个很简单的BLOG实现。

其实使用Django只需要基础的python知识。所以,大家都去试试吧。

以下为网址:

Django官网: https://www.djangoproject.com/

BLOG实现教程:http://brenelz.com/blog/a-detailed-django-tutorial-blog-basics-part-i/


开始工作

首先是准备工作,你需要在电脑中安装Django,以及一个数据库(这里为了简单,就不介绍了)。

之后,通过输入django-admin.py startproject myblog”来创建一个包含django项目的myblog目录。进入myblog目录后你们会看到以下4个文件:

__init__.py

manage.py

urls.py

setting.py

简单介绍一下这些文件内容:

__init__.py :是用来告诉python这个文件夹的内容是一个可以被其他python package import 或者include 的 package。 这就使得我们的应用程序能被django框架执行。这也是这个文件存在的意义。

manage.py:提供了通过设置settings.py,django-admin.py所能给出的命令。这就使得你能够执行:python manage.py runserver来在服务器上运行你的项目,而不用将你的项目模块添加到python 模块中再设置settings.py文件。

urls.py:描述了服务端urls与函数调用的映射,并最终返回一个http response。URLs都是通过正则表达式来做映射的。

settings.py:包含了项目相关的设置。在其中有为独立应用设置的参数,也有全局参数(例如数据库database和时区timezone信息)

了解了这些后,我们开始进行对settings.py的设置:

首先是数据库,我使用的是mysql,所以如下:

[python] view plaincopyprint?
  1. DATABASES = {  
  2.     'default': {  
  3.         'ENGINE''django.db.backends.mysql'# Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.  
  4.         'NAME''myblog_db',                      # Or path to database file if using sqlite3.  
  5.         'USER''djangouser',                      # Not used with sqlite3.  
  6.         'PASSWORD''123456',                  # Not used with sqlite3.  
  7.         'HOST''',                      # Set to empty string for localhost. Not used with sqlite3.  
  8.         'PORT''',                      # Set to empty string for default. Not used with sqlite3.  
  9.     }  
  10. }  

如果你使用的是别的数据库,那么请自行设定。

有一点值得注意,在settings.py中的文件路径必须是绝对路径。因为相对路径是不清楚的(one of python's philosophies)。但是我们可以通过在settings.py中添加以下代码段来让我们在settings.py中可以使用相对路径。

[python] view plaincopyprint?
  1. import os  
  2. rel = lambda *x: os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)  

代码中第一行import了python提供的os模块,其中包含了路径相关操作。

第二行中我们创建了一个称做rel的lambda/anonymous函数。在python中,lambda函数通常是带返回值的短短一行的函数,而它的返回值是隐式传递的。作为lambda函数定义的一部分,任意多的参数都将被储存于x数组中。

让我们来用一下上面定义的函数来设置TEMPLATE_DIRS:

[python] view plaincopyprint?
  1. TEMPLATE_DIRS = (  
  2.     rel(‘templates’),  
  3. )  

这样我们就将TEMPLATE_DIRS与当前项目目录中的templates子目录关联起来了。再次强调,若没有定义rel函数,在settings.py中对文件路径的设置需使用绝对路径。

保存,我们的开始工作就做好了。

创建第一个应用

若一个BLOG没有帖子(posts),还称得上BLOG么?所以我们第一个要做的是一个blog posts的应用。你需要做的是在项目目录中执行:

django-admin.py startapp posts or python manage.py startapp posts

这样就创建了一个叫做posts的子目录以及应用。

进入posts目录你会看到以下文件:

__init__py:作用与项目中的__init__.py一样

models.py:包含了与存储在数据库中数据相关的类,是数据库中数据到python的一个映射。

view.py:包含了项目中urls.py中所映射到的函数。这些函数还是数据库数据与模板的“粘合剂”。

test.py:为应用提供一个用来测试的文件

在开始实现功能之前,我们首先需要为应用添加一些model。我们的帖子模型将会是最精简的。那么,打开models.py文件,添加下列代码:

[python] view plaincopyprint?
  1. from django.contrib.auth.models import User  
  2. class Post(models.Model):  
  3.     author = models.ForeignKey(User, related_name=’posts’)  
  4.     title = models.CharField(max_length=200)  
  5.     body = models.TextField()  
  6.     pub_date = models.DateTimeField(auto_now_add=True)  
  7.     up_date = models.DateTimeField(auto_now=True)  
  8.     def __unicode__(self):  
  9.         return self.title  

补充:‘self’是什么?

Python是一门清晰的语言。所以在类的方法中的开头需要额外添加一个参数作为该类的一个实例。而这个实例通常称做self。这就像$this变量在php或者this在java中的效果一样。

以上的代码展示了我们的从django的Model类中继承的模型中的数据。第一行import了django提供的Usermodel,这样就为我们的项目添加了“用户”支持,其中包括认证与权限。但在这个例子中,我们只需要将用户与帖子的发表者联系起来就行了。称做related_name的关键参数是一个可变的名称,是User模型储存帖子列表。默认为<model_name>_set,但这里我们定义为posts。

每个帖子都会有一个标题(title)字段,在数据库中是一个最大长度为200字符的字段。通过数据库(假设你是用Django来创建表)和Django保存使这个字段生效。内容(body)字段是自解释的,它创建了一个用来保存大量文本字符串的字段。发帖时间(Pub_date)和更新时间(up_date)在数据库中以时间(datetime)字段形式储存。关键字参数auto_now_add设置这些字段在模型被加入到数据库时自动存入当前时期与时间。同样的,一旦模型被保存auto_now就自动提供当前的时间。

最后,我们定义了一个__unicode__方法。这个方法在一个帖子实例被请求自动展示使会被调用返回一个unicode字符串。

这样我们的模型就定义好了~

接下来需要在项目中加上我们自己定义的应用。在settings.py中的INSTALLED_APPS添加posts,结果如下:

[python] view plaincopyprint?
  1. INSTALLED_APPS = (  
  2.     ’django.contrib.auth’,  
  3.     ’django.contrib.contenttypes’,  
  4.     ’django.contrib.sites’,  
  5.     ’posts’,  
  6. )  

在应用被装载时,它们是按照上面列出的顺序装载的。所以你自己定义的应用应该放在最后,因为它们依赖于Django内置的应用。

我们能通过python manage.py syncdb命令来告诉Django在数据库中创建INSTALLED_APPS已有模型的表。

这里需要注意一个django syncdb的缺陷:

manage.py syncdb不会做模式迁移。这意味着syncdb只会创建数据库中不存在的表,若该表已存在,django syncdb不会做任何事。这样,在你想对model&table做出一些修改时就会出现问题了。最简单的方法是运行python manage.py reset <appname>来删除并重新创建特定应用的表,但这样你就失去了之前所存的数据。或者,目前有许多django开发者实现的第三方模式迁移的实现,这些值得注意。但到目前,官方没有相关方法。

当创建django.contrib.auth表时,程序会要求你创建一个超级用户,按照程序一直执行下去。之后,会介绍创建管理员界面,并用超级用户登录。


PS:先到这,感觉有些地方值得注意:

1.related_name

2.django syncdb的缺陷

原创粉丝点击