Python全棧工程師學習筆記 | Django的模型層

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

Model模型

模型是你的數據的唯一的、權威的信息源。它包含你所儲存數據的必要字段和行為。

通常,每個模型對應數據庫中唯一的一張表。

  • 每個模型都是django.db.models.Model的一個Python 子類。

  • 模型的每個屬性都表示為數據庫中的一個字段。

  • Django 提供一套自動生成的用於數據庫訪問的API;

  • 這極大的減輕了開發人員的工作量,不需要面對因數據庫變更而導致的無效勞

模型與數據庫的關係

模型(Model)負責業務對象和數據庫的關係映射(ORM)

ORM是「對象-關係-映射」的簡稱,主要任務是:

  1. 根據對象的類型生成表結構

  2. 將對象、列表的操作,轉換為sql語句

  3. 將sql查詢到的結果轉換為對象、列表

為什麼要用模型?

Model是MVC框架中重要的一部分,主要負責程序中用於處理數據邏輯的部分。通常模型對象負責在數據庫中存取數據

它做到了數據模型與數據庫的解耦,即數據模型的設計不需要依賴於特定的數據庫,通過簡單的配置就可以輕鬆更換數據庫

配置Mysql數據庫

1.在當前環境中安裝mysql

1sudoapt-getinstallmysql-server2sudoaptinstallmysql-client3sudoaptinstalllibmysqlclient-dev

2.在當前python環境中安裝 pymysql

1pip3installpymysql

3.在mysql中創建數據庫

1createdatabasesmytestdefaultcharset=utf8

4.在Django項目中配置數據庫修改settings.py文件中的DATABASE配置項

1DATABASES={ 2'default':{ 3'ENGINE':'django.db.backends.mysql', 4'NAME':'mytest',#選擇數據庫的名,請確認你的mysql中有這個庫 5'USER':'root', 6'PASSWORD':'', 7'HOST':'localhost', 8'PORT':'3306', 9}10}

5.告訴Django在接下來的mysql操作中使用pymysql

打開 myweb/__init__.py,寫入以下代碼導入pymysql:

1importpymysql2pymysql.install_as_MySQLdb()

開發流程

1.在models.py中定義模型類,要求繼承自models.Model

1fromdjango.dbimportmodels 2fromdatetimeimportdatetime 3 4#Createyourmodelshere. 5classUsers(models.Model): 6name=models.CharField(max_length=32) 7age=models.IntegerField(default=20) 8phone=models.CharField(max_length=16) 9addtime=models.DateTimeField(default=datetime.now)1011#classMeta:12#db_table="myapp_users"#指定表名

2.把應用加入settings.py文件的installed_app項

編輯myweb/settings.py文件,並將項目應用文件名添加到該INSTALLED_APPS設置。

1INSTALLED_APPS=[2'django.contrib.admin',3'django.contrib.auth',4'django.contrib.contenttypes',5'django.contrib.sessions',6'django.contrib.messages',7'django.contrib.staticfiles',8'myapp',9]

3.生成遷移文件

1python3manage.pymakemigrations 2 3django.core.exceptions.ImproperlyConfigured:ErrorloadingMySQLdbmodule:Nomo 4dulenamed'MySQLdb'. 5DidyouinstallmysqlclientorMySQL-python? 6安裝上面"配置Mysql數據庫"的第五步配置,或安裝:pipinstallmysqlclient後就可以了 7 8若執行pythonmanage.pymakemigrations命令(也可能人比較皮,把migrations文件夾給刪了),會提示"Nochangesdetected."可能有用的解決方式如下: 910先pythonmanage.pymakemigrations--emptyyourappname生成一個空的initial.py11再pythonmanage.pymakemigrations生成原先的model對應的migrationfile

4.執行遷移

1python3manage.pymigrate

5.使用模型類進行crud操作(具體詳見第二小節)

▌字段類型

  • AutoField:一個根據實際ID自動增長的IntegerField,通常不指定

    • 如果不指定,一個主鍵字段將自動添加到模型中

  • BooleanField:true/false 字段,此字段的默認表單控制是CheckboxInput

  • NullBooleanField:支持null、true、false三種值

  • CharField(max_length=字符長度):字符串,默認的表單樣式是 TextInput

  • TextField:大文本字段,一般超過4000使用,默認的表單控件是Textarea

  • IntegerField:整數

  • DecimalField(max_digits=None, decimal_places=None):使用python的Decimal實例表示的十進制浮點數

    • DecimalField.max_digits:位數總數

    • DecimalField.decimal_places:小數點後的數字位數

  • FloatField:用Python的float實例來表示的浮點數

  • DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date實例表示的日期

    • 參數DateField.auto_now:每次保存對象時,自動設置該字段為當前時間,用於”最後一次修改”的時間戳,它總是使用當前日期,默認為false

    • 參數DateField.auto_now_add:當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,默認為false

    • 該字段默認對應的表單控件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控件,和一個「Today”的快捷按鈕,包含了一個額外的invalid_date錯誤消息鍵

    • auto_now_add, auto_now, and default 這些設置是相互排斥的,他們之間的任何組合將會發生錯誤的結果

  • TimeField:使用Python的datetime.time實例表示的時間,參數同DateField

  • DateTimeField:使用Python的datetime.datetime實例表示的日期和時間,參數同DateField

  • FileField:一個上傳文件的字段

  • ImageField:繼承了FileField的所有屬性和方法,但對上傳的對象進行校驗,確保它是個有效的image

▌字段選項

  • 通過字段選項,可以做到對字段的約束

  • 在字段對象時通過關鍵字參數指定

  • null:如果為True,Django 將空值以NULL 存儲到數據庫中,默認值是 False

  • blank:如果為True,則該字段允許為空白,默認值是 False

  • 對比:null是數據庫范疇的概念,blank是表單驗證證范疇的

  • db_column:字段的名稱,如果未指定,則使用屬性的名稱

  • db_index:若值為 True, 則在表中會為此字段創建索引

  • default:默認值

  • primary_key:若為 True, 則該字段會成為模型的主鍵字段

  • unique:如果為 True, 這個字段在表中必須有唯一值

關係

  • 關係的類型包括

    • ForeignKey:一對多,將字段定義在多的端中

    • ManyToManyField:多對多,將字段定義在兩端中

    • OneToOneField:一對一,將字段定義在任意一端中

  • 可以維護遞歸的關聯關係,使用’self’指定,詳見「自關聯」

  • 用一訪問多:對象.模型類小寫_set

1bookinfo.heroinfo_set

  • 用一訪問一:對象.模型類小寫

1heroinfo.bookinfo

  • 訪問id:對象.屬性_id

1heroinfo.book_id

元選項

  • 在模型類中定義類Meta,用於設置元信息

  • 元信息db_table:定義數據表名稱,推薦使用小寫字母,

  • 數據表的默認名稱:<app_name>_<model_name>

  • 例如myweb_users

  • ordering:對象的默認排序字段,獲取對象的列表時使用,接收屬性構成的列表

1classBookInfo(models.Model):2...3classMeta():4ordering=['id']

  • 字符串前加-表示倒序,不加-表示正序

1classBookInfo(models.Model):2...3classMeta():4ordering=['-id']

  • 排序會增加數據庫的開銷

示例演示

  • 創建test2項目,並創建booktest應用,使用mysql數據庫

  • 定義圖書模型

1classBookInfo(models.Model):2btitle=models.CharField(max_length=20)3bpub_date=models.DateTimeField()4bread=models.IntegerField(default=0)5bcommet=models.IntegerField(default=0)6isDelete=models.BooleanField(default=False)

  • 英雄模型

1classHeroInfo(models.Model):2hname=models.CharField(max_length=20)3hgender=models.BooleanField(default=True)4isDelete=models.BooleanField(default=False)5hcontent=models.CharField(max_length=100)6hbook=models.ForeignKey('BookInfo')

  • 定義index、detail視圖

  • index.html、detail.html模板

  • 配置url,能夠完成圖書及英雄的展示

測試數據

  • 模型BookInfo的測試數據

1insertintobooktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete)values2('射雕英雄傳','1980-5-1',12,34,0),3('天龍八部','1986-7-24',36,40,0),4('笑傲江湖','1995-12-24',20,80,0),5('雪山飛狐','1987-11-11',58,24,0)

  • 模型HeroInfo的測試數據

1insertintobooktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete)values 2('郭靖',1,1,'降龍十八掌',0), 3('黃蓉',0,1,'打狗棍法',0), 4('黃藥師',1,1,'彈指神通',0), 5('歐陽鋒',1,1,'蛤蟆功',0), 6('梅超風',0,1,'九陰白骨爪',0), 7('喬峰',1,2,'降龍十八掌',0), 8('段譽',1,2,'六脈神劍',0), 9('虛竹',1,2,'天山六陽掌',0),10('王語嫣',0,2,'神仙姐姐',0),11('令狐沖',1,3,'獨孤九劍',0),12('任盈盈',0,3,'彈琴',0),13('嶽不群',1,3,'華山劍法',0),14('東方不敗',0,3,'葵花寶典',0),15('胡斐',1,4,'胡家刀法',0),16('苗若蘭',0,4,'黃衣',0),17('程靈素',0,4,'醫術',0),18('袁紫衣',0,4,'六合拳',0)

1classBookInfo(models.Model):2...3books=models.Manager()

  • 當為模型類指定管理器後,django不再為模型類生成名為objects的默認管理器

2. 創建對象

  • 當創建對象時,django不會對數據庫進行讀寫操作

  • 調用save()方法才與數據庫交互,將對象保存到數據庫中

  • 使用關鍵字參數構造模型對象很麻煩,推薦使用下面的兩種之式

  • 說明:init方法已經在基類models.Model中使用,在自定義模型中無法使用

3. 實例的屬性

  • DoesNotExist:在進行單個查詢時,模型的對象不存在時會引發此異常,結合try/except使用

4. 實例的方法

  • __str__(self):重寫object方法,此方法在將對象轉換成字符串時會被調用

  • save():將模型對象保存到數據表中

  • delete():將模型對象從數據表中刪除

1filter(鍵1=值1,鍵2=值2)2等價於3filter(鍵1=值1).filter(鍵2=值2)

  • 返回單個值的方法

    • get():返回單個滿足條件的對象

      • 如果未找到會引發”模型類.DoesNotExist”異常

      • 如果多條被返回,會引發”模型類.MultipleObjectsReturned”異常

    • count():返回當前查詢的總條數

    • first():返回第一個對象

    • last():返回最後一個對象

    • exists():判斷查詢集中是否有數據,如果有則返回True

限制查詢集

  • 查詢集返回列表,可以使用下標的方式進行限制,等同於sql中的limit和offset子句

  • 注意:不支持負數索引

  • 使用下標後返回一個新的查詢集,不會立即執行查詢

  • 如果獲取一個對象,直接使用[0],等同於[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()引發DoesNotExist異常

1#這會返回前5個對象LIMIT52Entry.objects.all()[:5]3#這將返回第六個到第十個對象OFFSET5LIMIT54Entry.objects.all()[5:10]

查詢集的緩存

  • 每個查詢集都包含一個緩存來最小化對數據庫的訪問

  • 在新建的查詢集中,緩存為空,首次對查詢集求值時,會發生數據庫查詢,django會將查詢的結果存在查詢集的緩存中,並返回請求的結果,接下來對查詢集求值將重用緩存的結果

  • 情況一:這構成了兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載

1print([e.titleforeinEntry.objects.all()])2print([e.titleforeinEntry.objects.all()])

  • 情況二:兩次循環使用同一個查詢集,第二次使用緩存中的數據

1querylist=Entry.objects.all()2print([e.titleforeinquerylist])3print([e.titleforeinquerylist])

  • 何時查詢集不會被緩存:當只對查詢集的部分進行求值時會檢查緩存,但是如果這部分不在緩存中,那麼接下來查詢返回的記錄將不會被緩存,這意味著使用索引來限制查詢集將不會填充緩存,如果這部分數據已經被緩存,則直接使用緩存中的數據

2. 字段查詢

  • 做到where子名,作為方法filter()、exclude()、get()的參數

  • 語法:屬性名稱__比較運算符=值

  • 表示兩個下劃線,左側是屬性名稱,右側是比較類型

  • 對於外鍵,使用「屬性名_id」表示外鍵的原始值

  • 轉義:like語句中使用了%與,匹配數據中的%與,在過濾器中直接寫,例如:filter(title__contains=”%”)=>where title like ‘%\%%’,表示查找標題中包含%的

比較運算符

  • exact:表示判等,大小寫敏感;如果沒有寫「 比較運算符」,表示判等

1filter(isDelete=False)

  • contains:是否包含,大小寫敏感

1exclude(btitle__contains='傳')

  • startswith、endswith:以value開頭或結尾,大小寫敏感

1exclude(btitle__endswith='傳')

  • isnull、isnotnull:是否為null

1filter(btitle__isnull=False)

  • 在前面加個i表示不區分大小寫,如iexact、icontains、istarswith、iendswith

  • in:是否包含在範圍內

1filter(pk__in=[1,2,3,4,5])

  • gt、gte、lt、lte:大於、大於等於、小於、小於等於

1filter(id__gt=3)

  • year、month、day、week_day、hour、minute、second:對日期間類型的屬性進行運算

1filter(bpub_date__year=1980)2filter(bpub_date__gt=date(1980,12,31))

跨關聯關係的查詢:處理join查詢

  • 語法:模型類名 <屬性名> <比較>

  • 註:可以沒有__<比較>部分,表示等於,結果同inner join

  • 可返向使用,即在關聯的兩個模型中都可以使用

1filter(heroinfo__hcontent__contains='八')

聚合函數

  • 使用aggregate()函數返回聚合函數的值

  • 函數:Avg,Count,Max,Min,Sum

1fromdjango.db.modelsimportMax2maxDate=list.aggregate(Max('bpub_date'))

  • count的一般用法:

1count=list.count()

Model模型的實戰操作筆記

1. 創建數據庫和表(若是執行表遷移,可跳過下面操作)

  • 進入MySQL數據庫創建數據庫:mytest

  • 進入數據庫創建數據表:myapp_users

1CREATETABLE`myapp_users`(2`id`int(10)unsignedNOTNULLAUTO_INCREMENT,3`name`varchar(32)NOTNULL,4`age`tinyint(3)unsignedNOTNULLDEFAULT'20',5`phone`varchar(16)DEFAULTNULL,6`addtime`datetime(6)NOTNULL,7PRIMARYKEY(`id`)8)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8

  • 添加幾條測試數據

2. 創建項目myweb和應用myapp

1#創建項目框架myweb 2$django-adminstartprojectmyweb 3 4$cdmyweb 5 6#在項目中創建一個myapp應用 7$python3.6manage.pystartappmyapp 8 9#創建模板目錄10$mkdirtemplates11$mkdirtemplates/myapp1213$cd..1415$treemyweb1617myweb18├──myweb19│├──__init__.py20│├──settings.py21│├──urls.py22│└──wsgi.py23├──manage.py24├──myapp25│├──admin.py26│├──apps.py27│├──__init__.py28│├──models.py29│├──tests.py30│└──views.py31└──templates32└──myapp

3.執行數據庫連接配置,網站配置

3.1 編輯myweb/myweb/__init__.py文件,添加Pymysql的數據庫操作支持

1importpymysql2pymysql.install_as_MySQLdb()

3.2 編輯myweb/myweb/settings.py文件,配置數據庫連接

1... 2#配置自己的服務器IP地址 3ALLOWED_HOSTS=['localhost','127.0.0.1','172.16.142.129'] 4 5... 6#添加自己應用 7INSTALLED_APPS=[ 8'django.contrib.admin', 9'django.contrib.auth',10'django.contrib.contenttypes',11'django.contrib.sessions',12'django.contrib.messages',13'django.contrib.staticfiles',14'myapp',15]16...1718#配置模板路徑信息19TEMPLATES=[20{21'BACKEND':'django.template.backends.django.DjangoTemplates',22'DIRS':[os.path.join(BASE_DIR,'templates')],23'APP_DIRS':True,24'OPTIONS':{25'context_processors':[26'django.template.context_processors.debug',27'django.template.context_processors.request',28'django.contrib.auth.context_processors.auth',29'django.contrib.messages.context_processors.messages',30],31},32},33]343536...37#數據庫連接配置38DATABASES={39'default':{40'ENGINE':'django.db.backends.mysql',41'NAME':'mytest',42'USER':'root',43'PASSWORD':'',44'HOST':'localhost',45'PORT':'3306',46}47...

4. 定義Model類

4.1 編輯myweb/myapp/models.py

1fromdjango.dbimportmodels 2 3 4classUsers(models.Model): 5name=models.CharField(max_length=32) 6age=models.IntegerField(default=20) 7phone=models.CharField(max_length=16) 8addtime=models.DateTimeField(default=datetime.now) 910def__str__(self):11returnself.name+":"+self.phone

4.2 測試Model類的使用

在項目根目錄下執行命令: python3 manage.py shell

1[root@localhostmyweb]#ls 2mywebmanage.pymyapp 3 4[root@localhostmyweb]#python3manage.pyshell 5Python3.6.1(default,Jul182017,01:35:19) 6[GCC4.4.720120313(RedHat4.4.7-18)]onlinux 7Type"help","copyright","credits"or"license"formoreinformation. 8(InteractiveConsole) 910>>>frommyapp.modelsimportUsers1112>>>Users.objects.all()13<QuerySet[<Users:張三:12345678901>,<Users:aa:13456789023>]>1415>>>s=Users.objects.get(id=1)1617>>>s.id1811920>>>s.name21'張三'2223>>>s.age24202526>>>s.phone27'12345678901'2829>>>

5.做到 Web 端訪問

5.1 編輯myweb/myweb/settings.py文件.做 ALLOWED_HOSTS 主機訪問配置(若第三步已做可跳過此步驟)

1#此處添加自己的IP地址2ALLOWED_HOSTS=['localhost','127.0.0.1','172.16.142.129']

5.2 編寫項目主路由urls配置,配置對myapp應用路由的訪問連接配置

1fromdjango.conf.urlsimportinclude,url2fromdjango.contribimportadmin34urlpatterns=[5url(r'^admin/',admin.site.urls),6url(r'^',include('myapp.urls')),7]

5.3 配置當前應用myapp的路由配置

在myapp應用目錄下創建一個路由文件urls.py文件,注意此文件編碼為utf-8(建議復制一個)。

編輯應用中的路由配置文件:myweb/myapp/urls.py, 內容如下:

1fromdjango.conf.urlsimporturl23from.importviews45urlpatterns=[6url(r'^$',views.index,name="index"),7]

5.4 編輯視圖文件:myweb/myapp/views.py,內容如下

 1#fromdjango.shortcutsimportrender 2fromdjango.httpimportHttpResponse 3 4frommyapp.modelsimportUsers 5 6defindex(request): 7try: 8s=Users.objects.get(id=1) 9returnHttpResponse(s)10except:11returnHttpResponse("沒有找到對應的信息!")

5.5 測試

項目根目錄下運行python3 manage.py sunserver 0:8000命令,開啟服務:

1[root@localhostmyweb]#python3.6manage.pyrunserver0:80002Performingsystemchecks...34Systemcheckidentifiednoissues(0silenced).56July28,2017-14:01:527Djangoversion1.11,usingsettings'myweb.settings'8Startingdevelopmentserverathttp://0:8000/9QuittheserverwithCONTROL-C.

打開瀏覽器,在瀏覽其中輸入網址測試:http://172.16.142.129:8000

顯示結果:張三:12345678901

繼續上面操作完成Web版的Users信息增 刪 改 查

1. 準備模板文件,創建模板目錄

  • 在項目目錄下創建templates模板目錄

  • 進入模板目錄templates,在模板目錄下創建應用名myapp的目錄

  • 進入myapp目錄,在里面創建一個users目錄

  • 進入users目錄,在里面創建文件:

    index.html,add.html,edit.html,menu.html,info.html

  • 設置模板目錄信息:編輯myweb/myweb/settings.py文件(若第三步已做可跳過此步驟)

1...2'BACKEND':'django.template.backends.django.DjangoTemplates',3'DIRS':[os.path.join(BASE_DIR,'templates'),],4'APP_DIRS':True,5...

2. 配置路由信息

打開文件:myweb/myapp/urls.py路由文件,加入六條路由配置信息

1fromdjango.conf.urlsimporturl 2 3from.importviews 4 5urlpatterns=[ 6url(r'^$',views.index,name="index"), 7url(r'^users$',views.indexUsers,name="users"),#瀏覽用戶信息 8url(r'^users/add$',views.addUsers,name="addusers"),#加載添加用戶信息表單 9url(r'^users/insert$',views.insertUsers,name="insertusers"),#執行用戶信息添加10url(r'^users/(?P<uid>[0-9]+)/del$',views.delUsers,name="delusers"),#執行用戶信息刪除11url(r'^users/(?P<uid>[0-9]+)/edit$',views.editUsers,name="editusers"),#加載用戶信息編輯表單12url(r'^users/update$',views.updateUsers,name="updateusers"),#執行用戶信息編輯13]

3. 編寫視圖文件:myweb/myapp/views.py

1#注意:需導入fromdjango.shortcutsimportrender 2 3fromdjango.shortcutsimportrender 4fromdjango.httpimportHttpResponse 5 6frommyapp.modelsimportUsers 7 8defindex(request): 9try:10list=Users.objects.filter(id__in=[1,3,5])11s=','.join([vo.nameforvoinlist])1213#修改(將id值為5的age值改為30)14#ob=Users.objects.get(id=5)15#ob.age=3016#ob.save()1718#刪除(刪除id為3的信息)19#ob=Users.objects.get(id=3)20#ob.delete()2122returnHttpResponse(s)23except:24returnHttpResponse("沒有找到對應的信息!")2526#瀏覽用戶信息27defindexUsers(request):28#執行數據查詢,並放置到模板中29list=Users.objects.all()30context={"stulist":list}31returnrender(request,"myapp/users/index.html",context)3233#加載添加信息表單34defaddUsers(request):35returnrender(request,"myapp/users/add.html")3637#執行信息添加操作38definsertUsers(request):39try:40ob=Users()41ob.name=request.POST['name']42ob.age=request.POST['age']43ob.phone=request.POST['phone']44ob.save()45context={'info':'添加成功!'}46except:47context={'info':'添加失敗!'}48returnrender(request,"myapp/users/info.html",context)4950#執行信息刪除操作51defdelUsers(request,uid):52try:53ob=Users.objects.get(id=uid)54ob.delete()55context={'info':'刪除成功!'}56except:57context={'info':'刪除失敗!'}58returnrender(request,"myapp/users/info.html",context)5960#加載信息編輯表單61defeditUsers(request,uid):62try:63ob=Users.objects.get(id=uid)64context={'user':ob}65returnrender(request,"myapp/users/edit.html",context)66except:67context={'info':'沒有找到要修改的信息!'}68returnrender(request,"myapp/users/info.html",context)6970#執行信息編輯操作71defupdateUsers(request):72try:73ob=Users.objects.get(id=request.POST['id'])74ob.name=request.POST['name']75ob.age=request.POST['age']76ob.phone=request.POST['phone']77#ob.addtime=datetime.now78ob.save()79context={'info':'修改成功!'}80except:81context={'info':'修改失敗!'}82returnrender(request,"myapp/users/info.html",context)

4. 編輯瀏覽信息視圖文件,

文件位置:

myweb/templates/myapp/users/index.html

1<!DOCTYPEhtml> 2<html> 3<head> 4<metacharset="utf-8"/> 5<title>用戶信息管理</title> 6<script> 7//自定義執行信息刪除提示判斷,參數uu是成功的刪除url地址 8functiondoDel(uu){ 9if(confirm("確定要刪除嗎?")){10//網頁跳轉11window.location=uu;12}13}1415</script>16</head>17<body>18<center>1920{%include'myapp/users/menu.html'%}2122<h3>瀏覽用戶信息</h3>23<tablewidth="800"border="1">24<tr>25<th>id號</th>26<th>姓名</th>27<th>年齡</th>28<th>電話</th>29<th>添加時間</th>30<th>操作</th>31</tr>32{%forstuinstulist%}33<tr>34<td>{{stu.id}}</td>35<td>{{stu.name}}</td>36<td>{{stu.age}}</td>37<td>{{stu.phone}}</td>38<td>{{stu.addtime|date:'Y-m-dH:i:s'}}</td>39<td>40<ahref="{%url'editusers'stu.id%}">編輯</a>41<ahref="javascript:doDel('{%url'delusers'stu.id%}');">刪除</a>42</td>43</tr>44{%endfor%}45</table>46</center>47</body>48</html>

5. 編輯添加表單視圖文件

文件位置:

myweb/templates/myapp/users/add.html

1<!DOCTYPEhtml> 2<html> 3<head> 4<metacharset="utf-8"/> 5<title>用戶信息管理</title> 6</head> 7<body> 8<center> 9{%include"myapp/users/menu.html"%}1011<h3>添加用戶信息</h3>12<formaction="{%url'insertusers'%}"method="post">13{%csrf_token%}14<tablewidth="280"border="0">15<tr>16<td>姓名:</td>17<td><inputtype="text"name="name"/></td>18</tr>19<tr>20<td>年齡:</td>21<td><inputtype="text"name="age"/></td>22</tr>23<tr>24<td>電話:</td>25<td><inputtype="text"name="phone"/></td>26</tr>27<tr>28<tdcolspan="2"align="center">29<inputtype="submit"value="添加"/>30<inputtype="reset"value="重置"/>31</td>32</tr>33</table>34</form>35</center>36</body>37</html>

6. 編輯信息表單視圖文件

文件位置:

myweb/templates/myapp/users/edit.html

1<!DOCTYPEhtml> 2<html> 3<head> 4<metacharset="utf-8"/> 5<title>用戶信息管理</title> 6</head> 7<body> 8<center> 9{%include"myapp/users/menu.html"%}10<h3>修改用戶信息</h3>11<formaction="{%url'updateusers'%}"method="post">12<inputtype="hidden"name="id"value="{{user.id}}"/>13{%csrf_token%}14<tablewidth="280"border="0">15<tr>16<td>姓名:</td>17<td><inputtype="text"name="name"value="{{user.name}}"/></td>18</tr>19<tr>20<td>年齡:</td>21<td><inputtype="text"name="age"value="{{user.age}}"/></td>22</tr>23<tr>24<td>電話:</td>25<td><inputtype="text"name="phone"value="{{user.phone}}"/></td>26</tr>27<tr>28<tdcolspan="2"align="center">29<inputtype="submit"value="編輯"/>30<inputtype="reset"value="重置"/>31</td>32</tr>33</table>34</form>35</center>36</body>37</html>

7. 編輯公共導航欄頁視圖文件

文件位置:

myweb/templates/myapp/users/menu.html

1<h2>用戶信息管理</h2>2<ahref="{%url'users'%}">瀏覽用戶</a>|3<ahref="{%url'addusers'%}">添加用戶</a>4<hr/>

文件位置:

myweb/templates/myapp/users/info.html

 1<!DOCTYPEhtml> 2<html> 3<head> 4<metacharset="utf-8"/> 5<title>用戶信息管理</title> 6</head> 7<body> 8<center> 9{%include"myapp/users/menu.html"%}1011<h3>{{info}}</h3>1213</center>14</body>15</html>

福利

公眾號後台回復:2018Python,獲取2018Python開源項目Top100整理資料!或掃碼添加小助手微信,回復:1,入群獲取。

Python全棧工程師學習筆記 | Django的模型層 科技 第1張

推薦閱讀:

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!