django 簡(jiǎn)要操作指南

一、安裝 Django

  • 通過(guò) pip 安裝正式發(fā)布版本

$ pip install Django

  • 使用 Git 安裝

$ git clone https://github.com/django/django.git #這會(huì)在當(dāng)前目錄創(chuàng)建一個(gè) django 目錄

$ pip install -e django/ #這會(huì)讓 Django 的代碼可導(dǎo)入,使得 django-admin 命令行工具可用。

  • 驗(yàn)證Django 是否能被 Python 識(shí)別
>>> import django
>>> print(django.get_version())
2.2
  • 查看 Django 版本

# 如果你得到的是一個(gè)“No module named django”的錯(cuò)誤提示,則表明你還未安裝。
$ python -m django --version


二、創(chuàng)建項(xiàng)目

# 打開(kāi)命令行,cd 到一個(gè)你想放置你代碼的目錄,然后運(yùn)行以下命令:
$ django-admin startproject mysite
# 這行代碼將會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè) mysite 目錄。

# startproject創(chuàng)建了如下內(nèi)容:
mysite/ #最外層的 mysite/ 根目錄只是你項(xiàng)目的容器, Django 不關(guān)心它的名字,你可以將它重命名為任何你喜歡的名字。
    manage.py  #管理 Django 項(xiàng)目的命令行工具。
    mysite/ #里面一層的 mysite/ 目錄包含你的項(xiàng)目,它是一個(gè)純 Python 包。它的名字就是當(dāng)你引用它內(nèi)部任何東西時(shí)需要用到的 Python 包名。(比如 mysite.urls).
        __init__.py #一個(gè)空文件,告訴 Python 這個(gè)目錄應(yīng)該被認(rèn)為是一個(gè) Python 包。
        settings.py #Django 項(xiàng)目的配置文件。
        urls.py #Django 項(xiàng)目的 URL 聲明,就像你網(wǎng)站的“目錄”。
        wsgi.py #作為你的項(xiàng)目的運(yùn)行在 WSGI 兼容的Web服務(wù)器上的入口。

三、用于開(kāi)發(fā)的簡(jiǎn)易服務(wù)器

# 切換到最外層的 mysite 目錄,執(zhí)行如下命令,啟動(dòng)項(xiàng)目。
$ python manage.py runserver #只能本機(jī)訪問(wèn),默認(rèn)訪問(wèn)地址:http://127.0.0.1:8000

$ python manage.py runserver 0.0.0.0:8080 #任何機(jī)器都可訪問(wèn),指定端口為8080

$ python manage.py runserver 0:8080 #官網(wǎng)這么寫(xiě)的


四、創(chuàng)建應(yīng)用

# 創(chuàng)建投票應(yīng)用(在最外層 mysite 目錄下創(chuàng)建應(yīng)用)
$ python manage.py startapp polls

#創(chuàng)建的 polls 應(yīng)用目錄結(jié)構(gòu)大致如下:
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py
# 這個(gè)目錄結(jié)構(gòu)包括了投票應(yīng)用的全部?jī)?nèi)容。

五、編寫(xiě)視圖

# 打開(kāi) polls/views.py,把下面這些 Python 代碼輸入進(jìn)去:
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
# 這是 Django 中最簡(jiǎn)單的視圖。如果想看見(jiàn)效果,我們需要將一個(gè) URL 映射到它。

在 polls 目錄里新建一個(gè) urls.py 文件

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

from . import views

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

根 URLconf 文件中指定我們創(chuàng)建的 polls.urls 模塊。

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

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
# 函數(shù) include()允許引用其它 URLconfs。每當(dāng) Django 遇到 include()時(shí),它會(huì)截?cái)嗯c此項(xiàng)匹配的 URL 的部分,并將剩余的字符串發(fā)送到 URLconf 以供進(jìn)一步處理。 include() 的設(shè)計(jì)理念是即插即用。

六、數(shù)據(jù)庫(kù)配置

打開(kāi) mysite/settings.py,設(shè)置 DATABASES 變量。

1、ENGINE -- 設(shè)定數(shù)據(jù)庫(kù)引擎,可選值如下:
  • 'django.db.backends.sqlite3',
  • 'django.db.backends.postgresql',
  • 'django.db.backends.mysql',
  • 'django.db.backends.oracle'
2、NAME -- 設(shè)定數(shù)據(jù)庫(kù)名稱、USER -- 填寫(xiě)數(shù)據(jù)庫(kù)的用戶名、PASSWORD -- 填寫(xiě)數(shù)據(jù)庫(kù)的登錄密碼、HOST -- 填寫(xiě)數(shù)據(jù)主機(jī) IP 地址、PORT -- 填寫(xiě)數(shù)據(jù)庫(kù)的訪問(wèn)端口(mysql默認(rèn)3306)
3、創(chuàng)建表格:

$ python manage.py migrate
#默認(rèn)開(kāi)啟的某些應(yīng)用需要至少一個(gè)數(shù)據(jù)表,使用該命令創(chuàng)建對(duì)應(yīng)的表格。


七、創(chuàng)建模型

編輯 polls/models.py文件:

from django.db import models

# 創(chuàng)建問(wèn)題模型 -- 對(duì)應(yīng)數(shù)據(jù)庫(kù)中的問(wèn)題表
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

# 創(chuàng)建選項(xiàng)模型 -- 對(duì)應(yīng)到數(shù)據(jù)庫(kù)中的選項(xiàng)表
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 子項(xiàng)添加點(diǎn)式路徑:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # 添加的 polls 應(yīng)用
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# 然后,運(yùn)行下面的命令:
$ python manage.py makemigrations polls
# 通過(guò)運(yùn)行 makemigrations 命令,Django 會(huì)檢測(cè)你對(duì)模型文件的修改,并且把修改的部分儲(chǔ)存為一次遷移。

migrate 命令:
  • sqlmigrate 命令接收一個(gè)遷移的名稱,然后返回對(duì)應(yīng)的 SQL

$ python manage.py sqlmigrate polls 0001

# 會(huì)看到如下輸出:

# 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 文件,改變模型;
  • 運(yùn)行 python manage.py makemigrations ,為模型的改變生成遷移文件;
  • 運(yùn)行 python manage.py migrate ,應(yīng)用數(shù)據(jù)庫(kù)遷移。

九、初試 API

# 進(jìn)入交互式 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)>]>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容