Django1.11版本的官方教程翻譯。
在這篇教程中,我們將設(shè)置你的數(shù)據(jù)庫(kù),創(chuàng)建你的第一個(gè)模型,并快速介紹Django的自動(dòng)生成的管理站點(diǎn)。
數(shù)據(jù)庫(kù)配置
現(xiàn)在打開(kāi)mysite/settings.py這是一個(gè)普通的python模塊,模塊變量表示Django的設(shè)定。
默認(rèn)情況下,Django配置使用SQLite數(shù)據(jù)庫(kù)。如果你是數(shù)據(jù)庫(kù)初學(xué)者,或者只是感興趣想隨便試試Django,這是最簡(jiǎn)單的選擇。SQLite包含在Python內(nèi),因此你不需要安裝任何其他東西來(lái)支持你的數(shù)據(jù)庫(kù)。所以當(dāng)你開(kāi)始你的第一個(gè)真實(shí)項(xiàng)目時(shí),你會(huì)想要使用一個(gè)更具擴(kuò)展性的數(shù)據(jù)庫(kù),比如PostgreSQL,以避免數(shù)據(jù)庫(kù)切換引發(fā)的麻煩。
如果你希望使用其他數(shù)據(jù)庫(kù),安裝合適的數(shù)據(jù)庫(kù)綁定并且在DATABASES'default'項(xiàng)目中修改keys以匹配數(shù)據(jù)庫(kù)連接設(shè)置:
ENGINE
比如 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', or 'django.db.backends.oracle'。還有很多其他后端也有提供。詳情請(qǐng)見(jiàn)NAME
你數(shù)據(jù)庫(kù)的名字。如果你使用SQLite,數(shù)據(jù)庫(kù)將是你計(jì)算機(jī)上的一個(gè)文件,這種情況下,NAME應(yīng)該是這個(gè)文件的完整絕對(duì)路徑,包括文件名。默認(rèn)值os.path.join(BASE_DIR, 'db.sqlite3')將文件春處在項(xiàng)目目錄中。
如果你不使用SQLite作為你的數(shù)據(jù)庫(kù),請(qǐng)務(wù)必添加USER, PASSWORD, 以及HOST。更多詳情
寫(xiě)給其他用戶的使用者
如果你在使用SQLite之外的數(shù)據(jù)庫(kù),請(qǐng)確保你使用前已經(jīng)創(chuàng)建了數(shù)據(jù)庫(kù),請(qǐng)?jiān)谀愕臄?shù)據(jù)庫(kù)里使用CREATE DATABASE database_name;。
同時(shí)確保
mysite/settings.py擁有創(chuàng)建數(shù)據(jù)庫(kù)的權(quán)限。這樣就可以自動(dòng)創(chuàng)建一個(gè)在后面的教程中需要的測(cè)試數(shù)據(jù)庫(kù)。
如果你正在使用SQLite,你不需要提前創(chuàng)建任何東西,數(shù)據(jù)庫(kù)文件會(huì)在必要的時(shí)候自動(dòng)創(chuàng)建。
當(dāng)你開(kāi)始編輯你的mysite/settings.py,設(shè)置你的TIME_ZONE為你的時(shí)區(qū)。
另外,注意INSTALLED_APPS放在文件最上面,它承載著這個(gè)Django實(shí)例中所有活動(dòng)的Django應(yīng)用的名字,應(yīng)用可以被使用于多個(gè)項(xiàng)目中,你可以打包分發(fā)他們讓別人在別的項(xiàng)目中使用。
默認(rèn)情況下,INSTALLED_APPS隨Django包含著幾個(gè)應(yīng)用。
-
django.contrib.admin管理站點(diǎn),你能立即使用上。
-django.contrib.auth認(rèn)證系統(tǒng)。
-django.contrib.contenttypes內(nèi)容類(lèi)型的框架
-django.contrib.sessionssession框架
-django.contrib.messagesmessaging框架
-django.contrib.staticfiles靜態(tài)文件管理
這些應(yīng)用默認(rèn)包括在內(nèi)以方便開(kāi)發(fā)者使用。
其中一些應(yīng)用程序,需要至少一個(gè)數(shù)據(jù)庫(kù)表才能使用,因此我們需要在數(shù)據(jù)庫(kù)中創(chuàng)建表,然后才能使用。請(qǐng)使用以下的命令:
python manage.py migrate
migrate命令查看INSTALLED_APPS的設(shè)置,并根據(jù)mysite/settings.py文件中的數(shù)據(jù)庫(kù)設(shè)置創(chuàng)建需要的數(shù)據(jù)庫(kù)表。如果你感興趣的話,打開(kāi)數(shù)據(jù)庫(kù)命令行,輸入以下命令來(lái)看看Django幫你創(chuàng)建了什么。
-
\dt(PostgreSQL), -
SHOW TABLES;(MySQL), -
.schema(SQLite), -
SELECT TABLE_NAME FROM USER_TABLES;(Oracle)
寫(xiě)給極簡(jiǎn)主義者
正如我們上面所說(shuō),我們包含了默認(rèn)應(yīng)用為了涵蓋常規(guī)使用,但并不是每個(gè)人都需要它們。如果你不需要,請(qǐng)?jiān)谶\(yùn)行migrate之前,從INSTALLED_APPS中隨意把注釋掉或者刪掉對(duì)應(yīng)的代碼。migrate命令只會(huì)運(yùn)行INSTALLED_APPS中的應(yīng)用。
創(chuàng)建模型
現(xiàn)在,我們使用額外的元數(shù)據(jù)來(lái)定義你的模型(本質(zhì)上就是你的數(shù)據(jù)庫(kù)布局)。
模型的哲學(xué)
一個(gè)模型是關(guān)于您的數(shù)據(jù)的唯一的確定的來(lái)源。它包含著您正在存儲(chǔ)的數(shù)據(jù)的基本字段和行為。Django遵從DRY原則。我們的目標(biāo)是在一個(gè)地方定義您的數(shù)據(jù)模型然后自動(dòng)地從中獲取數(shù)據(jù)。這就包括了遷移在里面。舉個(gè)例子,不像Ruby on Rails,Django的遷移完全源自您的數(shù)據(jù)模型,并且本質(zhì)上只是Django可以通過(guò)更新數(shù)據(jù)庫(kù)模式來(lái)匹配當(dāng)前模型的歷史。
在我們這個(gè)簡(jiǎn)單的投票應(yīng)用中,我們會(huì)創(chuàng)建兩個(gè)模型:問(wèn)題(question)和選擇(choice)。一個(gè)問(wèn)題有一個(gè)問(wèn)題內(nèi)容和一個(gè)發(fā)布時(shí)間。一個(gè)選擇有選擇的文本和投票計(jì)數(shù)器。每個(gè)選擇都會(huì)和一個(gè)問(wèn)題關(guān)聯(lián)。
這些概念通過(guò)簡(jiǎn)單的python類(lèi)就可以表現(xiàn)出來(lái)。按照以下代碼,編輯你的polls/models.py文件。
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)
這些代碼非常明確。每個(gè)模型通過(guò)一個(gè)繼承自django.db.models.Model的類(lèi)來(lái)表示。每個(gè)模型都有一些類(lèi)變量,每個(gè)變量都表示模型中的數(shù)據(jù)庫(kù)字段。
每個(gè)字段通過(guò)實(shí)例中的一個(gè)字段類(lèi)表示,比如CharField是字符字段,DateTimeField是時(shí)間字段。這會(huì)告訴Django每個(gè)字段保存著什么類(lèi)型的數(shù)據(jù)。
每個(gè)字段實(shí)例的名字(比如question_text和pub_date)是字段的對(duì)機(jī)器友好的格式的名字,你以后可以在你的Python代碼中使用這個(gè)值,你的數(shù)據(jù)庫(kù)也會(huì)用它作為列名稱(chēng)。
你可以使用(可選的)第一個(gè)位置參數(shù)作為指定的可讀的名稱(chēng)。他可以用于Django的幾個(gè)introspective(內(nèi)?。┎糠?,同時(shí)作為文檔。如果沒(méi)有提供,則Django將使用機(jī)器可讀的名稱(chēng)作為名字。在這個(gè)例子中,我們只對(duì)Question.pub_date定義了一個(gè)名字。對(duì)于其他所有的字段都會(huì)默認(rèn)使用自己的機(jī)器名作為名字。
有些字段類(lèi)有一些必須的參數(shù)要填。舉例,CharField要求你給出最大長(zhǎng)度max_length。這不僅會(huì)用在數(shù)據(jù)庫(kù)中,也會(huì)在驗(yàn)證中使用,后面我們會(huì)講到。
一個(gè)字段也可以擁有很多可選的參數(shù),比如我們可以看到,我們班votes的默認(rèn)值設(shè)成了0。
最后一點(diǎn),注意關(guān)系是由外鍵定義的。這告訴Django,每一個(gè)Choice都和只和一個(gè)問(wèn)題相關(guān)。Django支持所有常見(jiàn)的數(shù)據(jù)庫(kù)關(guān)系:多對(duì)一,多對(duì)多,一對(duì)一。
激活模型(activating models)
這個(gè)簡(jiǎn)單的模型告訴了Django很多信息。通過(guò)它,Django可以做到:
- 為這個(gè)APP創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)對(duì)象集合
- 創(chuàng)建一個(gè)Python數(shù)據(jù)庫(kù)訪問(wèn)API來(lái)訪問(wèn)問(wèn)題和選項(xiàng)的對(duì)象。
但是首先,我們應(yīng)該告訴我們的項(xiàng)目,polls應(yīng)用已經(jīng)被安裝了。
Django哲學(xué)小課堂
Django的應(yīng)用是可插拔的。您可以在多個(gè)項(xiàng)目中使用某個(gè)應(yīng)用程序,你可以分發(fā)應(yīng)用程序,因?yàn)樗麄儾⒉皇呛徒o定的Django安裝綁定的。
為了把對(duì)應(yīng)的應(yīng)用包括進(jìn)我們的項(xiàng)目中,我們需要在INSTALLED_APPS設(shè)置中添加對(duì)其配置類(lèi)的引用。PollsConfig類(lèi)在polls/app.py文件中,路徑是polls.apps.PollsConfig。編輯mysite/settings.py文件,添加路徑到INSTALLED_APPS設(shè)置中。
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', ]
現(xiàn)在Django已經(jīng)知道要把polls應(yīng)用囊括在內(nèi)了,下面運(yùn)行另一條命令:
python manage.py makemigrations polls
你會(huì)看到類(lèi)似下面的結(jié)果:
Migrations for 'polls': polls/migrations/0001_initial.py: -Creat model Choice -Create model Question -Add field question to choice
通過(guò)運(yùn)行makemigrations,你可以告訴Django你已經(jīng)對(duì)你的model做出了一些改變,并且你希望這些改變可以作為migration存儲(chǔ)起來(lái)。(在現(xiàn)在的例子里是創(chuàng)建了一個(gè)新的model)
Django通過(guò)Migration來(lái)存儲(chǔ)你的模型(也即是數(shù)據(jù)庫(kù)對(duì)象)的變化。他們只是硬盤(pán)上的一些文件。如果你想,你可以為你的新模型讀取一個(gè)Migration(遷移);也就是polls/migrations/0001_initial.py文件。不用擔(dān)心,你并不需要每次Django作出改變都要讀取它們,但是如果你想手動(dòng)調(diào)整Django如何改變內(nèi)容,那么它們是被設(shè)計(jì)為可以人為編輯的。
有一個(gè)命令可以幫你運(yùn)行migration并且自動(dòng)管理你的數(shù)據(jù)庫(kù)對(duì)象,也就是我們稍后會(huì)介紹的migrate(遷移)。但是首先讓我們看看migration會(huì)運(yùn)行什么樣的SQL。sqlmigrate命令接受遷移名稱(chēng),并且返回其SQL:
python manage.py sqlmigrate polls 0001
你應(yīng)該會(huì)看到類(lèi)似下面的結(jié)果
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;
注意:
- 具體的輸出會(huì)根據(jù)你如何使用的數(shù)據(jù)庫(kù)而變化,上面的例子是根據(jù)PostgreSQL寫(xiě)的。
- 表的名字會(huì)根據(jù)應(yīng)用的名字以及模型的小寫(xiě)名自動(dòng)生成(你可以覆蓋這個(gè)行為)
- 主鍵會(huì)自動(dòng)生成(你可以覆蓋這個(gè))
- 按照慣例,django將"_id"附加到外鍵字段名稱(chēng)。
- 它根據(jù)你使用的數(shù)據(jù)庫(kù)量身打造,因此數(shù)據(jù)庫(kù)特定的字段類(lèi)型比如
auto_increment(MySQL),serial(PostgreSQL)或是integer primary key autoincrement(SQLite) 都會(huì)自動(dòng)幫你處理。字段名的引用也同樣如此。 -
sqlmigrate命令并不會(huì)真的讓你的數(shù)據(jù)庫(kù)遷移,只是打印到屏幕上,讓你可以看到Django需要什么SQL。這對(duì)于檢查Django在干什么或者有需要SQL腳本更改的數(shù)據(jù)庫(kù)管理員非常有用。
如果你感興趣,你還可以運(yùn)行python manage.py check,這會(huì)不進(jìn)行任何遷移,不接觸數(shù)據(jù)庫(kù)來(lái)檢查你的項(xiàng)目有沒(méi)有什么問(wèn)題。
現(xiàn)在,再次運(yùn)行migrate創(chuàng)建你的模型吧。
`$ 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`
migrate 命令接收所有未應(yīng)用的遷移(Django通過(guò)一個(gè)叫做django_migrations的特殊表聊跟蹤哪些遷移被應(yīng)用了)并根據(jù)數(shù)據(jù)庫(kù)運(yùn)行他們。本質(zhì)上是將你對(duì)模型的更改與數(shù)據(jù)庫(kù)對(duì)象進(jìn)行同步。
遷移非常強(qiáng)大,他可以讓你一邊建設(shè)你的項(xiàng)目,一邊慢慢地改變你的數(shù)據(jù)庫(kù),而且不用刪除你的數(shù)據(jù)庫(kù)或者表,或者創(chuàng)建一個(gè)新的。它專(zhuān)門(mén)用于實(shí)時(shí)升級(jí)數(shù)據(jù)庫(kù),而不會(huì)丟失數(shù)據(jù)。我們將在本教程的后續(xù)部分中更深入地介紹它們,但是現(xiàn)在,請(qǐng)記住進(jìn)行模型更改的三步指南:
- 更改你的模型(在
models.py中)。 - 運(yùn)行
python manage.py makemigrations來(lái)創(chuàng)建這些更改的遷移 - 運(yùn)行
python manage.py migrate將這些更改應(yīng)用于數(shù)據(jù)庫(kù)。
Django有單獨(dú)的命令來(lái)制作和應(yīng)用遷移的原因是因?yàn)槟梢蕴峤贿w移到版本控制系統(tǒng)并將其發(fā)送到您的應(yīng)用程序; 它們不僅可以使您的開(kāi)發(fā)更容易,而且還可以被其他開(kāi)發(fā)人員和生產(chǎn)中使用。
請(qǐng)閱讀 django-admin文檔,了解有關(guān) manage.py 可以執(zhí)行的操作的完整信息。
玩轉(zhuǎn)API
現(xiàn)在,我們一起進(jìn)入交互式的Python shell,并使用Django提供的免費(fèi)API。要調(diào)用Python shell,請(qǐng)使用一下命令:
python manage.py shell
我們沒(méi)有簡(jiǎn)單的輸入python而是使用這個(gè)命令,因?yàn)?code>manage.py設(shè)置了DJANGO_SETTINGS_MODULE環(huán)境變量,這給了Django提供了你的mysite/settings.py文件的Python導(dǎo)入路徑。
繞過(guò)manage.py
如果你不想用manage.py也沒(méi)問(wèn)題, 只要將DJANGO_SETTINGS_MODULE
環(huán)境變量設(shè)置給mysite.settings,打開(kāi)一個(gè)普通的python shell,然后設(shè)置Django:
>>>import django
>>>django.setup()
如果這引發(fā)了一個(gè)AttributeError,你也許用的Django版本不是1.11,請(qǐng)更換不同版本的教程或者升級(jí)你的Django。
你必須在manage.py所在的目錄下運(yùn)行Python,或者保證目錄在Python路徑上,
import mysite才能正常工作。
更多相關(guān)信息,請(qǐng)參考django-admin documentation。
進(jìn)入了shell后,我們來(lái)看看database API:
>>> from polls.models import Question, Choice # 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. Note that this might say "1L" instead of "1", depending
# on which database you're using. That's no biggie; it just means your
# database backend prefers to return integers as Python long integer
# objects.
>>> 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>]>
等一下!<>完全是一個(gè)沒(méi)有任何幫助的表達(dá),讓我們編輯問(wèn)題模型(在polls/models.py文件中)來(lái)解決這個(gè)問(wèn)題。然后添加__str__()方法到Question和Choice。
polls/models.py
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible# only if you need to support Python 2
class Question(models.Model): def __str__(self): return self.question_text
@python_2_unicode_compatible# only if you need to support Python 2
class Choice(models.Model): def __str__(self): return self.choice_text
__str__()方法的添加是很重要的,不光是為了你自己處理交互提示的方便,也是因?yàn)閷?duì)象的展示是通過(guò)Django的自動(dòng)生成admin的。
注意這些都是普通Python方法,現(xiàn)在我們添加一個(gè)自定義方法,為了演示使用。
polls/models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model): def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
請(qǐng)注意,添加import datetime和django.utils import timezone可以分別在django.utils.timezone中引用Python的標(biāo)準(zhǔn)datetime模塊和Django的時(shí)區(qū)相關(guān)實(shí)用程序。如果您不熟悉Python中的時(shí)區(qū)處理,您可以在時(shí)區(qū)文檔.中了解更多信息。
保存這些更改并通過(guò)再次運(yùn)行python manage.py shell啟動(dòng)一個(gè)新的Python shell:
>>> from polls.models import Question, Choice
# Make sure our __str__() addition worked.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
# Django provides a rich database lookup API that's entirely driven by
# keyword arguments.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>
# Get the question that was published this year.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# Request an ID that doesn't exist, this will raise an exception.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
# Lookup by a primary key is the most common case, so Django provides a
# shortcut for primary-key exact lookups.
# The following is identical to Question.objects.get(id=1).
>>> Question.objects.get(pk=1)
<Question: What's up?>
# Make sure our custom method worked.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# Give the Question a couple of Choices. The create call constructs a new
# Choice object, does the INSERT statement, adds the choice to the set
# of available choices and returns the new Choice object. Django creates
# a set to hold the "other side" of a ForeignKey relation
# (e.g. a question's choice) which can be accessed via the API.
>>> q = Question.objects.get(pk=1)
# Display any choices from the related object set -- none so far.
>>> q.choice_set.all()
<QuerySet []>
# Create three choices.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
# Choice objects have API access to their related Question objects.
>>> c.question
<Question: What's up?>
# And vice versa: Question objects get access to Choice objects.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
# The API automatically follows relationships as far as you need.
# Use double underscores to separate relationships.
# This works as many levels deep as you want; there's no limit.
# Find all Choices for any question whose pub_date is in this year
# (reusing the 'current_year' variable we created above).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# Let's delete one of the choices. Use delete() for that.
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
有關(guān)模型關(guān)系的更多信息,請(qǐng)參閱訪問(wèn) 相關(guān)文檔. 有關(guān)如何使用雙下劃線通過(guò)API執(zhí)行字段查找的更多信息,請(qǐng)參閱 Field lookups. 有關(guān)數(shù)據(jù)庫(kù)API的完整詳細(xì)信息,請(qǐng)參閱我們的 Database API reference.
Django Admin介紹
"Django的哲學(xué)"小課堂
Django管理站點(diǎn)是為你的員工或者客戶的簡(jiǎn)單的添加,更改,刪除這些繁瑣工作而設(shè)計(jì)的。Django管理站點(diǎn)會(huì)完全自動(dòng)生成模型的管理站。
Django當(dāng)年創(chuàng)建于新聞編輯室,為內(nèi)容管理而生的,“內(nèi)容發(fā)布者”和“公共”網(wǎng)站之間的界限非常明確。網(wǎng)站管理人員使用該系統(tǒng)添加新聞故事,事件,體育比分等,該內(nèi)容顯示在公共站點(diǎn)上。 Django解決了為站點(diǎn)管理員創(chuàng)建統(tǒng)一界面來(lái)編輯內(nèi)容的問(wèn)題。
這個(gè)管理站點(diǎn)不打算由網(wǎng)站訪問(wèn)者使用。這是網(wǎng)站經(jīng)理。
創(chuàng)建一個(gè)管理員用戶
首先,我們需要?jiǎng)?chuàng)建一個(gè)用戶來(lái)登錄管理站點(diǎn)。使用下面的命令:
python manage.py createsuperuser
輸入你想要的用戶名
Username: admin
輸入郵箱地址
Email address: admin@example.com
最后輸入你的密碼兩次。
Password: **********
Password (again): *********
Superuser created successfully.
開(kāi)啟你的開(kāi)發(fā)服務(wù)器
django管理站點(diǎn)會(huì)自動(dòng)啟動(dòng),我們只要啟動(dòng)開(kāi)發(fā)服務(wù)器就可以來(lái)一起探索它了。
使用python manage.py runserver開(kāi)啟服務(wù)器。
現(xiàn)在打開(kāi)一個(gè)瀏覽器,并且去/admin/-例如http://127.0.0.1:8000/admin/你應(yīng)該會(huì)看到Django administration的登錄界面。