Django速成:构建一个Blog

1.创建项目

组织Django代码最简单的方式是使用Django的“项目”(project):一个包含了组成单个网站的所有文件的目录。Django提供了一个叫django-admin.py的命令来帮助创建这样项目的目录。

Windows下:

(py2_django) E:\Demo_Django>django-admin startproject mysite
(py2_django) E:\Demo_Django>

运行之后,我们用资源管理器,可以发现新建了一个mysite文件夹,如图:

  • 解释:
    • (1) __init__.py 把这个项目目录变成一个Python的包(package)——相关Python模块的一个集合。这让我们可以用Python的“点记号”(dot-notation)来指定项目中的某个部分,比如mysite.urls。

    • (2) manage.py 是一个同这个Django项目一起工作的工具。你可以从它在目录列表中的权限里看到它是可以执行的。我们马上就会用到它。

    • (3) settings.py 包含了项目的默认设置。包括数据库信息、调试标志以及其他一些重要的变量。你项目里安装的任何应用都可以访问这个文件。

    • (4) urls.py文件在Django里叫URLconf,它是一个将URL模式映射到你应用程序上的配置文件。URLconf是Django里非常强大的一个特性。

2.运行开发服务器

到这里,我们还没有构建完blog应用,不过Django为我们提供了一些可以就地使用的方便。其中最好用的就是Django的内置Web服务器了。这个服务器不是用来部署公共站点,而是用来做快速开发的。其优点在于:

  • 不需要安装Apache、Lighttpd,或是其他任何实际生产所需的Web服务器软件一—一如果你在一台新的服务器或是没有服务器环境的开发机上,或是就想实验一下的话,那就非常方便了。

  • 它会自动检测到你对Python源码的修改并且重新加载那些模块。相比每次修改代码后都要手动地重启Web服务器可是大大地节约了不少时间,这对绝大多数Python的Web服务器设置来说都是很有必要的。

  • 它知道如何为admin应用程序寻找并显示静态的媒体文件,所以你就可以直接使用它。运行开发服务器(或“dev”)简单到只需要一个命令就行了。这里我们要用到项目里的manage.py工具,这是一个简单的包襄脚本,能直接告诉django-admin.py去读入项目特定的settings文件。启动dev的命令如下:

接着,进入\Demo_Django\mysite

(py2_django) E:\Demo_Django>cd mysite

(py2_django) E:\Demo_Django\mysite>python manage.py runserver

回车后,可以看到类似如下的输出,Ctrl+C可以退出:

(py2_django) E:\Demo_Django\mysite>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin,
 auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 10, 2019 - 19:59:26
Django version 1.11, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

复制 http://127.0.0.1:8000/ 到浏览器中,回车后,可以看到Django的“It worked!”页面,如下图:

同时,查看终端的话,会看到dev服务器记录下了GET请求。

[10/Apr/2019 20:07:11] "GET / HTTP/1.1" 200 1716

log从左到右有4个部分:时间戳、请求、HTTP状态码,以及字节数。(你看到的字节数或许会有所不同。)

成功启动服务器后,我们就可以来设置我们的第一个Django应用了。

3.创建Blog应用

有了项目以后,就可以在它下面创建应用(按Django的说法是“app”)了。我们再次使用manage.py来创建这个blog app。

(py2_django) E:\Demo_Django\mysite>python manage.py startapp blog

这样就完成项目的创建了。现在我们在项目的目录下有了一个blog目录。如下图:

和项目一样,app也是一个包。现在.py文件里还没有真正的代码,它们只是先占住位子而已。

要告诉Django这个app是项目里的一部分,需要去编辑settings.py文件(也称之为“配置文件”)。打开配置文件并在文件尾部找到INSTALLED_APPS元组。把你的app以模块的形式添加到元组里,就像这样(注意结尾的逗号):

'blog',

如图所示:

Django用INSTALLED_APPS来决定系统里不同部分的配置,包括自动化的admin应用以及测试框架。

4.设计Model

现在我们来到了这个基于Django的blog应用的核心部分:models.py文件。
这是我们定义blog数据结构的地方。根据DRY原则,Django会尽量利用你提供给应用程序的model信息。我们先来创建一个基本的model,看看Django用这个信息为我们做了点什么。
用你最习惯的编辑器(如果它能支持Python模式就最好)打开models.py文件。你会看到这样的占位文本:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.

删掉注释,加入下列代码:

class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

即,如下图所示:

这是一个完整的model,代表了一个有3个变量的“BlogPost”对象。(严格说来应该有4个,Django会默认为每个model自动加上一个自增的、唯一的id变量。)这个新建的BlogPost类是django.db.models.Model的一个子类。这是Django为数据model准备的标准基类,它是Django强大的对象关系映射(ORM)系统的核心。此外,每一个变量都和普通的类属性一样被定义为一个特定变量类(field class)的实例。这些变量类也是在django.db.models里定义,它们的种类非常多,从BooleanField到XMLField应有尽有,可不止这里看到的区区三个。

5.设置数据库

用数据库管理工具为Django项目创建一个新的数据库。在这里我们把数据库取名为“djangodb”,不过你可以选用任何喜欢的名字。
当你有了一个(空的)数据库以后,接下来只需要告诉Django如何使用它即可。这就需要用到项目的settings.py文件。

使用数据库服务器

这里选用MySQL这样的关系数据库和Django配合使用。这里有6个相关的设置(虽然你可能只要两个就够了):

  • DATABASE_ENGINE
  • DATABASE_NAME
  • DATABASE_HOST
  • DATABASE_PORT
  • DATABASE_USER
  • DATABASE_PASSWORD

它们的作用从名字上就能看的出来。只需在相应的位置填入正确的值就可以了。
MySQL的设置如下:

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangodb',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',

    }
}

创建表

首先,我们先配置一下E:\Demo_Django\mysite\blog下的__init__.py文件的内容,添加内容如下:

import pymysql
pymysql.install_as_MySQLdb()

现在你可以告诉Django用你提供的连接信息去连接数据库并且设置应用程序所需的表。命令很简单:

# 老版本:
(py2_django) E:\Demo_Django\mysite>python manage.py syncdb
     
# Django 1.7.1 及以上的版本需要用以下命令
(py2_django) E:\Demo_Django\mysite>python manage.py makemigrations
No changes detected

(py2_django) E:\Demo_Django\mysite>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

(py2_django) E:\Demo_Django\mysite>

python manage.py makemigrations 和 python manage.py migrate的区别

6.试用admin

应用程序需要告诉Django要在admin窗口里显示哪一个model以供编辑。要做到这一点很简单,只要定义之前提到的默认admin站点,并向其注册BlogPost model就行了。打开mysite/blog/models.py文件,确认导入了admin应用,然后在最后加上一行注册model的代码。

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

from django.contrib import admin

class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

admin.site.register(BlogPost)

之后,

(py2_django) E:\Demo_Django\mysite>python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model BlogPost

(py2_django) E:\Demo_Django\mysite>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

在浏览器输入 http://127.0.0.1:8000/admin


纳尼?用户名和密码?我们还没有设过啊?

接下来,创建超级管理员权限:

(py2_django) E:\Demo_Django\mysite>python manage.py createsuperuser
Username (leave blank to use 'administrator'): admin
Email address: [email protected]
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
Password:
Password (again):
Superuser created successfully.  # admin123

(py2_django) E:\Demo_Django\mysite>

好了,现在我们登陆后台。操作如下:

(py2_django) E:\Demo_Django\mysite>python manage.py runserver

打开浏览器, http://127.0.0.1:8000/admin ,
输入刚刚创建的用户名和密码,进入后台,如下所示:

确认你的应用程序Blog和截图里一样出现在屏幕上。
如果没有的话,请重新检查之前的步骤。

提示
三个最常见的“我的app没有显示在admin里”的原因是:
1)忘记向admin.site.register注册你的model类;
2)models.py里有错误;
3)忘记在settings.py中的INSTALLED_APPS里添加app。

有没有内容的blog么?点击Blog Posts右侧的Add按钮。Admin会显示一个表单让你添加新的帖子,如图所示。

给帖子取一个名字然后往里填一点内容。
至于时间戳,你可以点击Today和Now的快捷链接来获取当前的日期和时间。还可以点击日历或时钟标志来方便地选择时间。
完成之后,点击Save按钮保存。

你会收到一条确认消息(“The blog post BlogPost object'was added successfully.”)和一个列出你所有blog帖子的列表——目前只有一篇而已,如图所示。

为什么帖子有“BlogPost object”这么难看的名字?Django的设计是希望能灵活地处理任意类型的内容,所以它不会去猜测对于给定的内容什么变量才是最合适的。在第三部分的例子里,你会看到如何为你对象的默认标签指定一个特定变量,或是特别定制的字符串。
现在点击右上角的“Add BlogPost+”按钮添加另一篇不同内容的帖子。

当你回到列表视图里,你会看见页面上加入了另一个BlogPost。如果你刷新页面或是离开应用程序再回来的话,输出不会有任何变化一—你一定不会喜欢看见所有条目都被标为“BlogPost object”,如图

有些难看,怎么样才可以更好看一些?

之前我们通过很少的配置就激活了admin工具,即向admin app注册我们的model。
现在只要额外的两行代码以及对注册调用的一些修改,我们就可以让列表看起来更漂亮更有用。更新我们的mysite/blog/models.py文件,添加一个BlogPostAdmin类,并将它加到注册代码那一行里,于是现在madels.py看起来是这样的:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

from django.contrib import admin

class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'timestamp')

admin.site.register(BlogPost, BlogPostAdmin)

开发服务器会注意到你的修改并自动重新加载model文件。

刷新一下页面,现在你就可以看到一个更有意义的页面了,它是根据你添加到BlogPostAdmin类里ist_display变量来生成输出的,如图所示。

试着点一下Title和Timestamp列的标题—一每一个都影响了你的条目是如何排序的。例如,点一下Title会按照升序排列标题,再点一下则变成降序排列。
Admin还有很多有用的特性只需一到两行代码就可以激活:搜索、自定义排序、过滤等。

猜你喜欢

转载自www.cnblogs.com/linusgau/p/10685796.html