尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
Model模型
模型是你的數據的唯一的、權威的信息源。它包含你所儲存數據的必要字段和行為。
通常,每個模型對應數據庫中唯一的一張表。
-
每個模型都是django.db.models.Model的一個Python 子類。
-
模型的每個屬性都表示為數據庫中的一個字段。
-
Django 提供一套自動生成的用於數據庫訪問的API;
-
這極大的減輕了開發人員的工作量,不需要面對因數據庫變更而導致的無效勞
模型與數據庫的關係
模型(Model)負責業務對象和數據庫的關係映射(ORM)
ORM是「對象-關係-映射」的簡稱,主要任務是:
-
根據對象的類型生成表結構
-
將對象、列表的操作,轉換為sql語句
-
將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,入群獲取。
推薦閱讀: