進入我們的項目Django-1.11.11
- 假設在創建之初, 我們通過此命令來創建: $
django-admin startproject DjangoApp
- 後期將最外層目錄修改爲了:
Django-1.11.11
- 根據我們使用的Django版本的文檔
運行開發服務器
-
$
python3 manage.py runserver
- 這樣只能本機調試訪問
-
$
python3 manage.py runserver 8080
- 該runserver命令在端口8000的內部IP上啓動開發服務器。當然也可以指定端口開啓服務,如8080端口
-
$
python3 manage.py runserver 0:8000
- 這樣啓動,通過
0
可以進行遠程訪問, 並且在settigns.py中ALLOWED_HOSTS添加自己的ip地址, 或支持所有 ALLOWED_HOSTS = [’*’] - runserver只能在本機使用, 是Django自帶的http服務
- 部署時應使用uwsgi
- 這樣啓動,通過
應用的創建
1 ) 創建一個應用程序
-
Django自帶一個實用程序,可以自動生成應用程序的基本目錄結構,因此您可以專注於編寫代碼而不是創建目錄。
-
要創建您的應用程序,請確保您與目錄位於同一目錄,manage.py 並鍵入以下命令:
- $
python3 manage.py startapp app
- $
-
這將創建一個目錄app,其目錄如下:
Django-1.11.11/ ├── manage.py ├── DjangoApp │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── app ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py └── views.py
2 ) 編寫我們的第一個視圖
-
我們來寫第一個視圖。打開文件app/views.py 並放入以下Python代碼:
from django.http import HttpResponse def index(request): return HttpResponse("Hello World!")
-
這是Django中最簡單的視圖。要調用視圖,我們需要將其映射到一個URL - 爲此,我們需要一個URLconf。
-
要在app目錄中創建一個URLconf,創建一個名爲urls.py。您的應用目錄應該如下所示:
└── app ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py
-
在app/urls.py文件中包含以下代碼:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
-
下一步是將根URLconf指向app.urls模塊, 在DjangoApp/urls.py添加一條import用於django.conf.urls.include和插入include()的urlpatterns列表
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app/', include('app.urls')), ]
-
其中include()函數允許引用其他URLconfs。請注意,該include()函數的正則表達式 沒有$(字符串匹配字符),而是尾部的斜槓。
-
每當Django遇到時 include(),它會排除與該點匹配的任何部分,並將剩餘的字符串發送到隨附的URLconf進行進一步處理。
-
背後的想法include()是使即插即用的URL變得容易。
-
注:include()當您包含其他網址格式時,您應始終使用。admin.site.urls是唯一的例外。
-
驗證index視圖連接到URLconf中, 運行以下命令:$
python manage.py runserver 0:8000
-
訪問:http://0.0.0.0:8000/app/ 可見
Hello World!
輸出
3 ) 關於url()函數的補充
- Django url() 可以接收四個參數,分別是兩個必選參數:regex、view 和兩個可選參數:kwargs、name,接下來詳細介紹這四個參數。
- regex: 正則表達式,與之匹配的 URL 會執行對應的第二個參數 view
- view: 用於執行與正則表達式匹配的 URL 請求
- kwargs: 視圖使用的字典類型的參數
- name: 用來反向獲取 URL
項目模型
1 ) 連接MySQL數據庫設置
- 默認情況下,配置使用SQLite。若不使用SQLite作爲數據庫,則需要額外的設置,例如 USER,PASSWORD和HOST必須加入。
- 其中ENGINE設置爲數據庫後端使用。內置數據庫後端有:
'django.db.backends.postgresql' 'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle'
- 在DjangoApp/settings.py文件中,通過DATABASES項進行數據庫設置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydemo', 'USER': 'root', 'PASSWORD': '', # 填入自己的密碼 'HOST': 'localhost', 'PORT': '3306', } }
- 注意:Django使用MySQL數據庫需要安裝PyMySQL, $
pip3 install pymysql
- 打開 DjangoApp/init.py,寫入以下代碼導入pymysql:
import pymysql pymysql.install_as_MySQLdb()
2 ) 創建模型
- 在我們的簡單的應用程序中,去創建一個stu表信息操作的Model類
- 編輯app/models.py文件
from django.db import models # Create your models here. class Stu(models.Model): '''自定義Stu表對應的Model類''' #定義屬性:默認主鍵自增id字段可不寫 id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) age = models.SmallIntegerField() sex = models.CharField(max_length=1) classid=models.CharField(max_length=8) # 定義默認輸出格式 def __str__(self): return "%s:%s:%s:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid) # 自定義對應的表名,默認表名:app_stu class Meta: db_table="stu"
3 ) 激活模型
- 要將該應用程序包括在我們的項目中,我們需要在設置中添加對其配置類的引用INSTALLED_APPS
- 該appConfig是在app/apps.py文件中,所以它的訪問路徑’app.apps.AppConfig’
- 編輯DjangoApp/settings.py文件,並將該虛線路徑添加到該INSTALLED_APPS設置
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app.apps.AppConfig', # 這裏或者直接寫 'app' ]
4 ) 交互式的Python shell
- 使用Django提供的免費API
$ python3 manage.py shell Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 03:02:14) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from app.models import Stu >>> mod = Stu.objects >>> lists = mod.all() >>> for v in lists: ... print(v) ... 1:zhangsan:10:m:p01 2:lisi:12:m:p02 3:lily:9:w:p03 >>> mod.get(id=1) <Stu: 1:zhangsan:10:m:p01> >>> mod.get(id=2) <Stu: 2:lisi:12:m:p02> >>> mod.get(id=3) <Stu: 3:lily:9:w:p03> >>> quit()
5 ) 在app應用的視圖中使用
-
文件:app/views.py 文件代碼
from django.shortcuts import render from django.http import HttpResponse from app.models import Stu # Create your views here. def index(request): return HttpResponse("Hello Django!") def stu(request): #獲取所有stu表信息 lists = Stu.objects.all() print(lists) #獲取單條學生信息 print(Stu.objects.get(id=1)) return HttpResponse("ok")
-
配置stu函數的訪問路由, 在app/urls.py文件中配置
url(r'^stu$', views.stu),
-
啓動服務後,在瀏覽器中訪問,在命令行終端中查看輸出效果: http://0.0.0.0:8000/app/stu
啓用網站Admin管理
1 ) 數據遷移
-
Django框架中有一個非常強大的應用功能–自動管理界面,常被Web平臺管理者使用,去管理整個Web平臺。
-
默認情況下,在settings.py配置文件中INSTALLED_APPS包含以下應用程序,這些應用程序都是由Django提供:
django.contrib.admin - 管理網站。你會很快使用它。
django.contrib.auth - 認證系統。
django.contrib.contenttypes - 內容類型的框架。
django.contrib.sessions - 會話框架。
django.contrib.messages - 消息框架。
django.contrib.staticfiles - 管理靜態文件的框架。 -
爲了後續的開發,默認這些應用程序都是包含在裏面的。
-
使用這些Django自帶的應用程序,需要我們在數據庫中創建一些數據表對應,然後才能使用它們。爲此,請運行以下命令(數據結構遷移):
- $
python3 manage.py migrate
- $
-
其中該migrate命令查看該INSTALLED_APPS設置,並根據DjangoApp/settings.py文件中的數據庫設置和應用程序隨附的數據庫遷移創建任何必需的數據庫表(稍後將介紹)。您會看到適用於每個遷移的消息。
$ python3 manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, 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 sessions.0001_initial... OK
-
默認情況下自動在我們的數據庫中創建了10張表,具體如下:
mysql> show tables; +----------------------------+ | Tables_in_mydb | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | stu | +----------------------------+ 11 rows in set (0.00 sec)
2 ) 創建管理員用戶
- 首先,我們需要創建一個可以登錄管理站點的用戶。運行以下命令:假設我們設置的密碼是
123456_admin
$ python3 manage.py createsuperuser Username (leave blank to use 'johnny'): Email address: [email protected] Password: Password (again): Superuser created successfully.
3 ) 啓動開發服務器
- 默認情況下,Django管理員站點被激活。讓我們開始開發服務器並探索它。
- 啓動開發服務器命令如下: $
python3 manage.py runserver 0.0.0.0:8000
- 現在,打開一個Web瀏覽器,訪問地址: http://0.0.0.0:8000/admin/ 輸入我們的用戶名/密碼即可登錄
4 ) 設置時區和語言
- 編輯DjangoApp/settings.py配置文件:
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
5 ) 將我們自定義的應用程序的加入到後臺管理
- 但我們的自定義應用程序在哪裏?並沒有顯示在後臺管理索引頁面上。
- 要做到這一點,打開app/admin.py 文件,並編輯代碼如下:
from django.contrib import admin from app.models import Stu admin.site.register(Stu)
6 ) 更深入設計後臺管理
-
編輯app/models.py文件,在Stu類中添加如下信息,讓後臺管理顯示中文字段
class Stu(models.Model): '''自定義Stu表對應的Model類''' #定義屬性:默認主鍵自增id字段可不寫 id = models.AutoField("學號",primary_key=True) name = models.CharField("姓名",max_length=16) age = models.SmallIntegerField("年齡") sex = models.CharField("性別",max_length=1) classid=models.CharField("班級",max_length=8) # 定義默認輸出格式 def __str__(self): return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid) # 自定義對應的表名,默認表名:app_stu class Meta: db_table="stu" verbose_name = '瀏覽學生信息' verbose_name_plural = '學生信息管理'
-
編輯app/admin.py 文件,實現信息管理的個性化定製
from django.contrib import admin # Register your models here. from app.models import Stu #Stu模型的管理器(裝飾器寫法) @admin.register(Stu) class StuAdmin(admin.ModelAdmin): #listdisplay設置要顯示在列表中的字段(id字段是Django模型的默認主鍵) list_display = ('id','name','age','sex','classid') #設置哪些字段可以點擊進入編輯界面 list_display_links = ('id','name') #list_per_page設置每頁顯示多少條記錄,默認是100條 list_per_page = 10 #ordering設置默認排序字段,負號表示降序排序 ordering = ('id',) #-id降序 #list_editable 設置默認可編輯字段 #list_editable = ['age','sex','classid'] #其他請詳見手冊文檔說明