Django2.1学习笔记
一、Django简介
Django是python的一个web框架,里面集成很多常见的web应用,能够帮助我们进行快速的web应用开发。当前Django共有1.x版本(对应python2)和2.1版本(对应python3),这里主要介绍Django2.1版本中的架构和设计思想和官网的例子。目前使用Django开源的项目中比较多使用的是1.x版本,但是随着发展2.1的版本将会是主流。
建议使用Anaconda安装python环境,这样可以同时存在python2和python3环境,根据需要打开不同python版本的Anaconda Prompt进行命令行的输入输出。本文是采用Anaconda3的Anaconda Prompt代替cmd命令行,否则直接使用cmd默认是使用Python2进行编译,后续的Django测试会报错。
1.1 Web架构、MVC/MTV
具体介绍Django之前,必须先介绍WEB框架等概念。
web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。一般的web架构如下图:
其它基于python的web框架,如tornado、flask、webpy都是在这个范围内进行增删裁剪的。WSGI可以简单理解为基于python语言并通过http协议将浏览器和服务器连接起来的桥梁。例如tornado用的是自己 的异步非阻塞“wsgi”,flask则只提供了最精简和基本的框架。Django则是直接使用了WSGI,并实现了大部分功能。
MVC/MTV指的是一种设计模式,MVC即(Model,View,Control),Model用于存储数据结构,View为前端展示,Control为逻辑控制即后台管理。这种设计模式很常见,例如QT的开发即是采用该种模式开发的。而MTV是Django的设计模式,本质上相同,知识其中的T代表着Templates,即模板。在Django的设计模式中,View等价于Control,Templates等价于MVC中的View。
需要详细了解Django设计模式、简单安装和架构内容的也可以访问Django2.1新手图文入门教程,本文根据官网的帮助文档进行admin模块的修改和嵌套一些开源的主题网页。建议需要深入学习Django可以查看官网的帮助文档。
1.2 Django的MTV模型组织
1.3 Django使用的总结
这里主要对Django的使用做一些系统的总结。方便大家更好地学习和记忆相关的内容。主要介绍几个重要的命令,需要详细了解请见官网帮助文档。
1.3.1 建立一个project的命令
打开Anaconda Prompt进入Shell, 采用cmd命令(如cd 等)进入到你想要创建项目的文件夹下面:
>>> python manage.py startproject django2demo
在Django2.1中也可以采用django-admin来创建项目
>>> django-admin startproject django2demo
需要详细了解其中的命令可以通过
>>>django-admin help
一般建立一个Project之后的文件目录的结构为:
- django2demo/
- manage.py ------用于管理project的文件
- django2demo/
- init.py ----python的init文件
- settings.py ----设置项目全局变量的文件,包括设置数据库、站点、APP路径等
- urls.py ----项目路由表设置
- wsgi.py
1.3.2 建立一个app的命令
>>> python manage.py startapp polls
在Django2.1中也可以采用django-admin来创建app
>>>django-admin startapp polls
注意:
一个app是Web应用中的一项功能比如博客系统、数据库;而一个项目是一个网站特定的app和配置的集合。一个项目可以包含多个app,一个app可以在多个项目中。
创建app目录一般为:
1.3.3 更新数据库相关的命令
在project中的settings.py中包含了数据库的相关设置,其中最重要的一个设置是INSTALLED_APPS的配置。当应用的数据格式发送变化时就需要使用migrate命令。
migrate命令查看INSTALLED_APPS的设置,并根据django2demo/settings.py文件中的数据库设置和应用程序附带的数据库变化并创建任何必要的数据库表(稍后我们将介绍这些)。对于它应用的每个迁移,您将看到一条消息。
>>>python manage.py migrate
models的哲学
模型包含要存储的数据的基本字段和行为,例如数据库的布局和额外的元数据。Django遵循DRY(Don’t repeat yourself)原则。目标是在一个地方定义您的数据模型,并自动从中派生出东西。
创建models
在poll的中创建两个模型: Question 和 Choice。其中一个Question有question_text和pub_data两个字段;一个Choice有choice_text和votes字段,同时每个Choice对应一个Question。
---- polls/models.py-----------------
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
最后,注意使用foreignkey定义了一个关系。这就告诉Django每个选择都与一个问题有关。Django支持所有常见的数据库关系:多对一、多对多和一对一。
激活 models
激活models在Django指的是:
创建一个数据库表单;
创建一个python数据库访问api用于访问Question 和 Choice对象。
注意:
Django应用程序是“可插入的”:你可以在多个项目中使用一个应用程序,并且可以分发应用程序,因为它们不必绑定到给定的Django安装中。
激活模型的步骤:
1)第一步:要使用app需要在 INSTALLED_APPS 中添加配置,PollsConfig类是polls/apps.py自动生成的,所以有 ‘polls.apps.PollsConfig’。在django2demo/settings文件中添加配置如下:
-----mysite/settings.py-------
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
2)第二步:调用makemigrations生成0001_initial.py文件
>>> python manage.py makemigrations polls
>Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
每次调用上述命令都会生成一个上述的文件,里面的内容可读性强,如果你想看到SQL中的migrate是怎么运行,可以调用sqlmigrate命令,可以看到以下的SQL语句:
>>> python manage.py sqlmigrate polls 0001
>BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL
);
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
COMMIT;
注意:
若觉得inital.py文件过多,可以全部删掉后运行命令,这样只有一个文件。
3)第三步:调用migrate将上述的修改更新到数据库中
>>> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
1.3.4 python shell
打开Anaconda Prompt进入Shell, 采用cmd命令(如cd 等)进入到你想要创建项目的文件夹下面:
>>> python manage.py shell
可以进行交互式的命令行调用对象,有助于学习和认识Django中的对象。
1.3.5 运行Django服务
>>> python manage.py runserver
默认打开的是8000端口,也可以指定端口
>>> python manage.py runserver 8080
或可以指定ip
>>> python manage.py runserver 192.168.1.1:8080
二、Django Admin站点
生成用于添加、更改和删除内容的管理后台不需要太多的创造力,是一项乏味的工作。因此,Django完全自动地为模型创建了管理接口。这就是Django中的admin模块。
Django类似于一个新闻编辑室,在“内容发布者”和“公共”网站之间有着非常清晰的分离。网站管理员使用该系统添加新闻故事、活动、体育成绩等,这些内容将显示在公共网站上。Django解决了为站点管理员创建统一的界面来编辑内容的问题。
2.1 创建一个admin用户
首先,我们需要创建一个用户来登录管理站点,并输入用户名和密码
>>>python manage.py createsuperuser
>Username: admin
>Username: admin
>Password: **********
Password (again): *********
Superuser created successfully.
若原先存在密码可以使用changepassword命令
>>>python manage.py changepassword admin
2.2 admin站点管理
Django admin站点默认是开启的,直接运行服务器
>>>python manage.py runserver
打开浏览器,输入 http://127.0.0.1:8000/admin/,可以看到登录界面:
由于默认情况下启用了翻译,根据浏览器的设置以及Django是否有此语言的翻译,登录屏幕可能会以您自己的语言显示。
警告:
翻译和格式化分别由 USE_I18N (控制翻译系统是否开启的变量,默认是True)和 USE_L10N(控制数据格式的localized,默认是false。如果设置为True,例如Django中的日期和数字会使用本地的形式)设置控制。然而,这两个特性都涉及internationalization and localization。这些场景的名字是Django历史遗留的结果。
简单实现中文的显示方式,可参看link
将poll放入admin后台中
打开polls/admin.py中添加如下代码,重新运行服务
#------polls/admin.py-----------------
from django.contrib import admin
from .models import Question
admin.site.register(Question)
推荐一个很好的Django的web应用例子Django2.0+xadmin,可以很好学习Django的内容。