第一個Django應用程序_part2

1、數據庫配置

此文延續第一個Django應用程序_part1html

打開mystic/settings.py。這是一個普通的Python模塊,其模塊變量表示Django配置 默認狀況下,配置使用SQLite。若是你是數據庫新手,或者你只是嘗試Django,這是最簡單的。SQLite包含在Python中,因此你不須要安裝其它任何東西來支持你的數據庫。

若是但願使用其它數據庫,在DATABASE'default'項目中修改如下的配置,以匹配你的數據庫鏈接設置:python

  • ENGINE - 除了'django.db.backends.sqlite3','django.db.backends.postgresql',django.db.backends.mysql','django.db.backends.oracle'。其它數據庫也支持
  • NAME - 數據庫的名稱。若是使用SQLite,數據庫將是你計算機上的文件;在這種狀況下,NAME應該是該文件的完整絕對路徑,包括文件名,默認值,將把文件存儲在你的

項目目錄中。os.path.join(BASE_DIR, 'db.sqlite3')。mysql

當鏈接到其它數據庫後端時,如Mysql,Oracle或PostagreSQL,將須要額外的鏈接參數。有關ENGINE如何指定其它數據庫類型,請參閱下面的設置,這個例子使用於Mysql:更多信息點我查看sql

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': '123',
'HOST': '192.168.56.31',
'PORT': '3306',
}
}

 

在和settings.py同級的__init__.py文件中添加以下內容:數據庫

告訴Django使用pymysql連接mysql數據庫django

import pymysql pymysql.install_as_MySQLdb()
  • 對於SQLite之外的數據庫

若是使用SQLite以外的數據庫,請確保您已經建立了一個數據庫。在數據庫的交互式提示符中使用"CREATE DATABASE database_name';還要確保mysite/settings.py中提供的數據庫用戶具備"建立數據庫"權限,這容許自動建立測試數據庫。若是您使用的是SQLite,則無需事先建立任何內容-數據庫文件將在須要時自動建立。後端

當您編輯mysite/settings.py時,將TIME_ZONE設置爲您的時區。瀏覽器

另外,請注意文件INSTALLED_APPS的頭部設置,它包含在此Django項目中激活的全部Django應用程序的名稱。應用程序能夠在多個項目中使用,您能夠將其打包分發給其它項目。服務器

默認狀況下,INSTALLED_APPS包含如下應用程序,因此這些應用程序都附帶在Django中:session

  • django.contrib.admin        網站管理。
  • django.contrib.auth          一個認證系統。
  • django.contrib.contenttypes      內容類型的框架。
  • django.contrib.sessions             會話框架。
  • django.contrib.message          消息傳遞框架。
  • django.contrib.staticfiles         一個管理靜態文件的框架。

其中一些應用程序至少須要一個數據庫表,所以咱們須要在數據庫中建立表,而後才能使用它們,請運行如下命令:

python3 manage.py migrate

migrate命令用來查看INSTALLED_APPS設置,並根據mysite/settings.py文件中的數據庫設置建立全部須要的數據庫表,應用程序還須要數據庫遷移。

2、建立model

在咱們的polls應用程序中,咱們將建立兩個模型:Question和Choice。Question有question和publication date兩個字段。Choice有兩個字段:choice text和vote tally。每一個

Chocie與Question對應。

編輯polls/models.py文件,以下所示:

from django.db import models # Create your models here. class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Chocie(models.Model): question = models.ForeignKey(Question,on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)

每一個Model有一個類django.db.models.Model的類表示。每一個Model都有一個變量,每一個變量都表示模型中的數據庫字段。

每一個字段由字段類的實例表示,例如字符字段的CharField和數據時間的DateTimeField。這告訴Django每一個字段擁有什麼類型的數據。

每一個Field實例(例如question_text或pub_date)是該字段的名稱,以機器友好的格式。您將在您的Python代碼中使用此值,而且您的數據庫將使用它做爲列名稱。

您可使用可選的第一個位置參數Field來指定一我的類可讀的名稱。在Django的一些內省部分使用,它能夠做爲文檔。若是未提供此字段,Django

將使用機器可讀的名稱。在這個例子中,咱們只爲Question.pub_date定義了一個可讀的名字。對於該模型中的全部其它字段,該字段的機器可讀名稱將足以做爲其可讀的名稱。

一些字段類具備必須的參數。例如,CharField要求您給它一個max_length。這不只在數據庫模式中使用,並且用於驗證。

最後,請注意使用ForeignKey定義關係。這告訴Django每一個Chocie與Question對應。Django支持全部常見的數據關係:多對一,多對多和一一對應。

3、激活Model

模型代碼給了Django不少信息,有了它,Django可以:

  • 爲此應用程序建立數據庫模式(CREATE TABLE語句)。
  • 建立一個Python數據庫訪問API,用於訪問question和Choice對象。

但首先咱們須要告訴咱們的項目,安裝polls應用程序。

提示:Django應用程序是「可插拔的」:您能夠在多個項目中使用應用程序,您能夠分發應用程序,由於它們沒必要與給定的Django安裝綁定。

要將該應用程序包含在咱們的項目中,咱們須要在設置中添加對其配置類的應用INSTALLED_APPS。PollsConfig類是在polls/apps.py文件中,所以其「點路徑」

爲"polls.apps.PollConfig"。編輯mysite/settings.py文件,並將"點路徑"添加到INSTALLED_APPS設置中。

INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]

如今Django知道包含polls應用程序。咱們運行另外一個命令:

python3 manage.py makemigrations polls

你應該看到相似如下內容:

Migrations for 'polls': polls/migrations/0001_initial.py - Create model Chocie - Create model Question - Add field question to chocie

經過運行makemigrations,你能夠告訴Django您對模型進行了一些更改(在這種狀況下,您已經建立了新的模型)。而且但願將更改存儲爲遷移。

遷移是Django如何存儲對模型(以及數據庫模式)的更改-它們只是磁盤上的文件。它是文件polls/migrations/001_initial.py。

有一個命令能夠爲您運行遷移並自動管理數據庫模式-這就是migrate。sqlmigrate命令接受遷移名稱並返回其SQL:

python3 manage.py sqlmigrate polls 0001

你應該看到相似如下內容:

BEGIN;
--
-- Create model Chocie
--
CREATE TABLE `polls_chocie` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Add field question to chocie
--
ALTER TABLE `polls_chocie` ADD COLUMN `question_id` integer NOT NULL;
ALTER TABLE `polls_chocie` ADD CONSTRAINT `polls_chocie_question_id_9c0a43fe_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);
COMMIT;

請注意如下幾點:

  • 確切的輸出將取決於您使用的數據庫,上面的例子是Mysql生成的。
  • 表名是經過組合應用程序的名稱(自動生成polls)和模型的小寫名字-question和choice。(您能夠覆蓋此行爲。)
  • 主鍵(ID)會自動添加。(你也能夠覆蓋它。)
  • 按照慣例,Django追加"_id"到外鍵字段名稱。(你也能夠重寫這個。)
  • 外鍵關係由FOREIGN KEY限制。不要擔憂DEFERRABLE部分;這只是告訴Mysql不執行外鍵直到事物結束。
  • 它適合您使用的數據庫,所以數據庫特定的字段類型,如auto_increment(MySQL),serial(PostgreSQL)或integer主要建

自增量(SQLite)將自動爲您處理。引用字段名稱也是如此,例如使用引號雙引號或單引號。

  • sqlmigrate命令實際上不會在數據庫上運行遷移-他只是將其打印到屏幕上,以便您能夠看到Django認爲須要執行的SQL語句。檢查Django要執行的操做或者

是否有須要SQL腳本進行更改的數據庫,而不進行遷移或操做數據庫。

如今,再次運行migrate以在數據庫中建立這些模型表:

python3 manage.py migrate

你會看到如下相似信息:

Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, 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 polls.0001_initial... OK Applying sessions.0001_initial... OK

   migrate命令接受全部未應用的遷移(Django使用名爲django_mirgrations的數據庫中的特殊表來跟蹤哪些遷移)並根據您的數據庫運行它們-基本上將您對模型所作

的更改與數據庫中的模式進行同步。

  遷移很是強大,隨着時間的推移,您能夠隨時更改模型,而無需刪除數據庫或表並建立新的數據庫-他專門用於實時升級數據庫,而不會丟失數據。

進行模型更改的三步指南:

  • 改變你的模型(models.py)
  • 運行覺得這些更改建立遷移python manage.py makeigrations。
  • 運行以將這些更改應用於數據庫。pyhton manage.py migrate。

4、介紹Django Admin

建立管理員用戶

建立一個登陸管理站點的用戶。運行如下命令:

python3 manage.py createsuperuser

輸入所需的用戶名,而後按Enter鍵。

Username (leave blank to use 'h'): admin

而後根據提示輸入所需的電子郵件地址:

Email address: admin@example.com

最後一步是輸入你的密碼。你將被要求輸入密碼兩次,第二次做爲第一次的確認。

Password: Password (again): Superuser created successfully.

啓動開發服務器

默認狀況下,Django管理員站點被激活。

若是服務器沒有啓動就運行如下命令:

python manage.py runserver

打開瀏覽器,而後轉到本地域的「/admin/」 例如:http://127.0.0.1:8000/admin/

進入管理員頁面

輸入上面建立的帳號及密碼登陸

在admin中修改polls應用

咱們須要告訴管理員Question對象有一個管理員界面。所以,打開polls/admin.py文件,而後將其編輯爲以下所示:

from django.contrib import admin # Register your models here. from .models import Question admin.site.register(Question)

瀏覽後臺管理功能

如今咱們註冊了Question項目,Django知道應該顯示在管理員索引頁面上。

 

點擊「POLLS」下的add 輸入以下圖所示信息:時間選擇今天、如今,而後點擊save--點擊Home

點擊「Question」。如今您在「更改列表」頁面尋找問題。此頁面顯示數據庫中的全部問題,並讓您選擇一個來更改它。咱們以前建立的「What's up?」

點擊"What's up?"問題編輯它

注意事項:

  • 表單是從Question模型自動生成的。
  • 不一樣的模型字段類型(DateTimeField,CharField)對應於適當的HTML輸入小部件。每種類型的字段指導如何在Django管理功能中顯示本身。
  • 每一個DateTimeField能夠得到靈活的JavaScript事件記錄。日期得到"今日"快捷方式和日曆彈出窗口,時間獲取「如今」快捷方式和一個方便的彈出窗口,列出經常使用的時間。

頁面底部提供了幾個選項:

  • Save :保存更改並返回到此類型對象的更改列表頁面。
  • Save and continue editing :保存更改並從新加載此對象的管理頁面。
  • Save and add another :保存更改並加載此類型對象的新空白表單。
  • Delete:顯示刪除確認頁面

若是"Date published"的值與Tutorial 1中建立問題的時間不匹配,則可能意味着你忘記爲TIME_ZONE設置正確的值。

更改它,從新加載頁面,並檢查確認頁面。

點擊"Today"和"Now"快捷方式更改"Date published'。而後點擊「Save and continue editing」。而後點擊右上角的"History"。你將看到一個頁面,其中列出了

經過Django管理員對此對象所作全部更改,以及進行更改的人員的時間戳和用戶名:

相關文章
相關標籤/搜索