django 简要操作指南

一、安装 Django

  • 通过 pip 安装正式发布版本

$ pip install Django

  • 使用 Git 安装

$ git clone https://github.com/django/django.git #这会在当前目录创建一个 django 目录

$ pip install -e django/ #这会让 Django 的代码可导入,使得 django-admin 命令行工具可用。

  • 验证Django 是否能被 Python 识别
>>> import django
>>> print(django.get_version())
2.2
  • 查看 Django 版本

# 如果你得到的是一个“No module named django”的错误提示,则表明你还未安装。
$ python -m django --version


二、创建项目

# 打开命令行,cd 到一个你想放置你代码的目录,然后运行以下命令:
$ django-admin startproject mysite
# 这行代码将会在当前目录下创建一个 mysite 目录。

# startproject创建了如下内容:
mysite/ #最外层的 mysite/ 根目录只是你项目的容器, Django 不关心它的名字,你可以将它重命名为任何你喜欢的名字。
    manage.py  #管理 Django 项目的命令行工具。
    mysite/ #里面一层的 mysite/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。(比如 mysite.urls).
        __init__.py #一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
        settings.py #Django 项目的配置文件。
        urls.py #Django 项目的 URL 声明,就像你网站的“目录”。
        wsgi.py #作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。

三、用于开发的简易服务器

# 切换到最外层的 mysite 目录,执行如下命令,启动项目。
$ python manage.py runserver #只能本机访问,默认访问地址:http://127.0.0.1:8000

$ python manage.py runserver 0.0.0.0:8080 #任何机器都可访问,指定端口为8080

$ python manage.py runserver 0:8080 #官网这么写的


四、创建应用

# 创建投票应用(在最外层 mysite 目录下创建应用)
$ python manage.py startapp polls

#创建的 polls 应用目录结构大致如下:
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py
# 这个目录结构包括了投票应用的全部内容。

五、编写视图

# 打开 polls/views.py,把下面这些 Python 代码输入进去:
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
# 这是 Django 中最简单的视图。如果想看见效果,我们需要将一个 URL 映射到它。

在 polls 目录里新建一个 urls.py 文件

# 在 polls/urls.py 中,输入如下代码:
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

根 URLconf 文件中指定我们创建的 polls.urls 模块。

# 在 mysite/urls.py 文件的 urlpatterns 列表里插入一个 include(), 如下:
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
# 函数 include()允许引用其它 URLconfs。每当 Django 遇到 include()时,它会截断与此项匹配的 URL 的部分,并将剩余的字符串发送到 URLconf 以供进一步处理。 include() 的设计理念是即插即用。

六、数据库配置

打开 mysite/settings.py,设置 DATABASES 变量。

1、ENGINE -- 设定数据库引擎,可选值如下:
  • 'django.db.backends.sqlite3',
  • 'django.db.backends.postgresql',
  • 'django.db.backends.mysql',
  • 'django.db.backends.oracle'
2、NAME -- 设定数据库名称、USER -- 填写数据库的用户名、PASSWORD -- 填写数据库的登录密码、HOST -- 填写数据主机 IP 地址、PORT -- 填写数据库的访问端口(mysql默认3306)
3、创建表格:

$ python manage.py migrate
#默认开启的某些应用需要至少一个数据表,使用该命令创建对应的表格。


七、创建模型

编辑 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)

八、激活模型

文件 mysite/settings.pyINSTALLED_APPS 子项添加点式路径:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # 添加的 polls 应用
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# 然后,运行下面的命令:
$ python manage.py makemigrations polls
# 通过运行 makemigrations 命令,Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移。

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;
改变模型需要三步:
  • 编辑 models.py 文件,改变模型;
  • 运行 python manage.py makemigrations ,为模型的改变生成迁移文件;
  • 运行 python manage.py migrate ,应用数据库迁移。

九、初试 API

# 进入交互式 Python 命令行,尝试 database API
$ python manage.py shell

>>> from polls.models import Choice, Question  # Import the model classes we just wrote.

# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>

# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# Save the object into the database. You have to call save() explicitly.
>>> q.save()

# Now it has an ID.
>>> q.id
1

# Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save()

# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容