django目录下的路由系统和视图函数
一、Django路由系統(url)
1、什么是路由系統
路由系統的本質是URL模式以及要為該URL模式調用的視圖函數之間的一個映射表即不同的url路徑對應的不同的函數,該路由系統是存放在全局配置文件urls.py中,之所以叫路由系統是為了好聽
2、路由系統格式:
urlpatterns = [url(正則表達式, views視圖函數,參數,別名),] 注釋:1、正則表達式就是Python中提及到的正則表達式,匹配的是url下的路徑 ?? 2、視圖函數就是url路徑對應的函數 ?? 3、參數就是需要往視圖函數傳遞的參數,是一個字典的形式 ??? 4、別名就是正則表達式所匹配到數據結果的別名 eg: 1、如圖無名函數 如果在路由規則中的正則表達式內既有無名分組又有通過字典形式傳遞給視圖函數的參數,那么就相當于傳遞了一個位置參數,兩個關鍵字參數,且遵循位置實參在關鍵字參數之前。 2、如圖有名函數 當路由規則中出現有名函數,那么視圖函數中傳遞的形參名稱和這個有名函數名稱一樣,必須叫ttt(相當于默認函數)。 ??? 3、如圖name參數: ????????????????????????? 主要是和html頁面中的form表單中的action路徑進行交互的,之所以加了/blog是由于我做了路由重分發,如果添加別名就不能對正則表達式進行無名分組和有名分組了 3、路由重分發(當有多個項目時可以把url對應的函數寫在每個項目內,需要在全局urls內做路由重分發,相當于給每個項目分配小組長) 1、格式 urlpatterns = [url(正則表達式,include(分發的文件路徑),] ?urlpatterns = [ url(r'^blog/', include('blog.urls')),] 注釋:該正則表達式匹配的是項目名稱,include的是項目名稱下寫路由系統的文件,以后訪問的路徑需要在其端口后加項目名稱。 全局urls配置文件需要先引入一個include模塊才能路由重分發(from django.conf.urls import url,include) 4、客戶端向服務器端傳遞參數的方式: ?? 1、通過數據傳遞參數,把數據寫在url上,通過?&傳參 eg: http://1277.0.0.1:8080/blog/?id=1200??? ? 2、通過路徑傳遞參數 ? eg:http://1277.0.0.1:8080/blog/1200
?? ??? 5、客戶端向服務器端發送請求的方式: 1、GET方式: 請求數據存放在url路徑里面 2、POST方式: 請求數據存放在post請求體里面 3、注意:get方式請求的參數只能存放在url路徑上,但是post方式請求的參數可以即可以存放在post請求體內也可以在url內。 ? 二、Django視圖函數(views) 1、在http協議中會產生兩個對象 ? http請求:HttpRequest對象,django自動創建?????? http響應:HttpResponse對象,需要自己手動創建,其實就是導入對象下的屬性(? HttpResponse類django.http.HttpResponse) 2、HttpRequest對象下的方法和屬性 1、path:請求頁面的全路徑,不包括請求ip和端口 2、method:請求是使用的什么方式,post或get,得到的結果是大寫的POST,GET 3、GET:get請求方式的請求體信息,得到的是個字典對象 4、POST:post請求方式的請求體信息,得到的是個字典對象 5、COOKIES: 包含所有cookies的標準Python字典對象;keys和values都是字符串。 3、HttpResponse對象下的方法和屬性 1、render():主要是做模板渲染用的 1、格式:render(req,"網頁名稱",{前端鍵:后端值}|locals()) 2、redirect("路徑"):主要是頁面跳轉用的 3、locals() :可以直接將函數中所有的變量傳給模板 4、關于redirect與render的區別:
?? ??? ??? ??????????? redirect走的是路徑,頁面跳轉路徑重新加載
?? ??? ??? ??? ??? ??? render返回的是模板,只是返回一個頁面,路徑不會重新加載。
三、Template基礎 (模板系統) 1、模板系統的組成 組成:HTML代碼+邏輯控制代碼 2、邏輯控制代碼的組成(語法格式) 1、格式1:使使用一個大括號加兩個百分號來渲染標簽,可以渲染任意類型的html標簽 {% %} 2、格式2:使用兩個大括號來渲染標簽內的變量,可以引用任意格式的變量。 {{?? }}? 注釋:只要帶有模板語法的html都稱之為模板,render方法渲染時 把后端變量嵌入到模板中,其格式為: render(客戶端請求體名稱,"發送的html模板",{''模板的值":"傳入的數據"}) 3、邏輯控制代碼的語句 1、萬能的句點號 模板系統可以通過點數字的方式來索取后端數據傳過來的列表和字典 2、{% if %} 的使用 1、使用{% if %} 時必須和{% endif %}連用,主要是在模板中進行判斷的其語法結構和python相同,都支持if elif? else等 2、{% if %} 標簽接受and,or或者not來測試多個變量值或者否定一個給定的變量 3、{% if %} 標簽不允許同一標簽里同時出現and和or,否則邏輯容易產生歧義,例如下面的標簽是不合法的: eg: {% if obj1 and obj2 or obj3 %} ? 3、{% for %}的使用 ? 1、格式:{% for obj in list [ 方法 ]%}??? 處理的對象 {% endfor %} 2、具體方法: 1、reversed:在標簽里添加reversed來反序循環列表 3、{% for %}標簽可以嵌套: 1、格式: {% for country in countries %} <h1>{{? country }}</h1><ul> {% for city in country.city_list %} <li>{{ city }}</li> {% endfor %} </ul> {% endfor %} 2、具體的嵌套對象: 1、forloop.counter表示循環的次數,它從1開始計數,第一次循環設為1 2、forloop.counter0 類似于forloop.counter,但它是從0開始計數,第一次循環設為0 3,forloop.revcounter ?? 4,forloop.revcounter0 ? 5,forloop.first當第一次循環時值為True,在特別情況下很有用: 4、empty的用法 {{li }} { {% for i in list %} <li>{{ forloop.counter0 }}----{{ i }}</li> {% empty %} <li>this is empty!</li> {% endfor %} 注釋:富有魔力的forloop變量只能在循環中得到,當模板解析器到達{% endfor %}時forloop就消失了,當用for循環一個list時,如果該list 為空那么就會走empty下面的語法 5、使用{% for %}時必須和{% endfor %}連用,基本語法和python一樣 4、filter過濾器的使用方式 1、語法格式:{{obj|filter:param}}??? obj為要操作的對象,filter為具體的操作方法,param為要做的值 filter所指代的具體操作方法:
1、add : 給obj變量加上相應的值,主要用于數字的相加 2、 addslashes : 給obj變量中的引號前加上斜線 ? ? 3、 capfirst : obj首字母大寫,主要是對字符串進行設置 ? 4、 cut : 從obj字符串中移除指定的字符 比如說是移除obj中的空格 eg:#value3='he llo wo r ld' {{ value3|cut:' ' }}<br> ? ? 5、 date : 格式化日期字符串 ? eg:#value4=datetime.datetime.now(){{ value4|date:'Y-m-d' }} 以年-月-日的方式訪問 ? ? 6、 default : 如果值是False,就替換成設置的默認值,否則就是用本來的值? eg:#value5=[ ] {{ value5|default:'空的' }} ? ? 7、 default_if_none: 如果值是None,就替換成設置的默認值,否則就使用本來的值 8、truncatechars? 按照字符串的個數截斷數據,截斷的數據按照省略號顯示 eg:{{ i|truncatechars:3}} 9、truncatewords 按照單詞的個數截斷數據,截斷的數據按照省略號顯示
eg:{{ i|truncatewords:4}} 5、{% url %}: ?引用路由配置的地址 (別名的使用)
6、with重新取名,就是說后端傳到前端的數據名字太長了就可以用with重新給他定義一個名稱 {% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %} 7、禁止模板渲染:verbatim {% verbatim %} ?????????{{ hello }}??
{% endverbatim %} 8、自定義filter和simple_tag 1、檢測settings配置文件的INSTALLED_APPS是否有自己的項目應用的文件名 2、在app應用中創建templatetags模塊包(必須這樣創建且模塊名稱不能改變) 3、創建任意 .py 文件,如:my_tags.py 4、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py :{% load my_tags %} 5、simple_tag和filter的區別 1、調用方式不同: filter是通過{{}}的方式來調用的,比如{{ num|filter_multi:2 }} simple_tag是通過{%%}的方式來調用的,比如{% simple_tag_multi num 5 6%} 2、所傳遞的值得個數不同 無論是自定義的filter還是模板自帶的filter只能傳遞一個值到模板中,也就是說":"后面最多只能有一個值 而simple_tag呢,后端自定義多少個值,前端就能接收多少個值。 3、filter可以在if等語句后使用,而simple_tag不可以 9、extend模板繼承 1、首先需要了解后臺管理布局(主要是通過position:fixed、overflow=auto的方式對布局進行定位) 2、模板繼承步驟 1、先在templates中創建好一個模板(母版)取名為base.html,以供子模板繼承 2、在需要繼承模板的子模板中添加上{% extends "母版名稱" %}即{% extends "base.html" %}之后子模板就繼承了母版的全部代碼 3、如果子模板需要替換母版上的代碼內容需要提前在母版需要替換的部分創建好盒子 格式:{% block x % } y {% endblock %} 其中x代表盒子的名稱,必須與后端替換的盒子名稱一樣,y代表需要替換的內容 ? 4、在子模板中創建母版內一樣的盒子,然后在其里面寫入你想要替換的代碼就可以了 格式:{% block x % } y {% endblock %} ? 其中x代表的是盒子的名稱與前端母版盒子名稱一樣,y代表的是替換后的內容 5、在子模板中可以通過{{ block.super }}這個標簽來獲取到母版中盒子的內容 格式:{% block x % }? {{ block.super }} y {% endblock %} ? {{ block.super }}代表獲取到母版盒子內的內容,y代表需要添加的內容,母版中盒子越多在子模板中可更改性就越強
四、Models數據庫
1、? django默認支持sqlite,mysql, oracle,postgresql數據庫,但是在測試環境默認選擇使用的是sqlite數據庫 2、orm對象映射關系 1、如圖所示: 注釋:類實例化對象一次就相當于是向表中添加一條記錄。 3、設置數據庫鏈接(setting中設置) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'books', #你的數據庫名稱 'USER': 'root', #你的數據庫用戶名 'PASSWORD': '', #你的數據庫密碼 ? 'HOST': '', #你的數據庫主機,留空默認為localhost ? 'PORT': '3306', #你的數據庫端口 } } 注釋:由于django對python3不支持mysqldb的搜素引擎,需先下載pymysql第三方模塊,然后在django程序中導入該模塊引用后正常連接 4、在models中設計數據庫表(就是設計表字段) 1、設計表字段方式 注釋:程序的models.py文件中需先引入一個模塊(from django.db import models),然后才能通過類來繼承該模塊從而設計表字段 2、字段類型參數 1、CharField(max_length=x) :字符串字段,用于較短的字符串,x指代的是字符串的長度 2、IntegerField():用于保存一個整數 3、DecimalField(max_digits=x,decimal_places=y) ? :用于保存一個浮點數,且必須要有兩個參數,x代表的是總位數,y代表的是小數點后面的位數 4、AutoField():添加一條記錄時會自增,一般應用于主鍵(my_id=models.AutoField(primary_key=True)----主鍵自增) 5、DateField()? :存放日期專門用的(日期格式為x-y-z) 6、TextField() :存放一個容量很大的文本字段 7、EmailField() :個帶有檢查Email合法性的 CharField,不接受 maxlength 參數 8、ImageField()? :存放圖片 5、在數據庫中創建表(將設計好的表進行創建,在終端上運行命令) 只要運行完第一條命令就會在自己創建項目下的migrations文件夾下產生一條rom表。 只要運行完第二條命令就會吧rom表中的對應信息在數據庫中創建出來。 6、數據庫表記錄的增刪改查 1、向數據庫插入一條記錄 方式1:通過表名.object.create(表字段=前端數據,表字段=前端數據)的方式插入記錄 方式2:通過類屬性賦值然后實例化產生一個對象,最后save的方式來插入記錄 方式3:批量插入數據
?
?
2、向數據庫查詢記錄 方式1:單表查詢 通過all()查詢表中所有的記錄,得到的是個對象列表 通過get()查詢表中某一條記錄,返回結果有且只有一個,如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。 ? 通過filter()過濾的方式來查詢特定的記錄,返回的結果是個列表對象 由于返回的是個對象列表,可以通過.屬性的方式來調用對象下的屬性值 也可以通過在models.py的類中添加__str__的方式來直接打印屬性值 其他查詢方式:下面的方法都是對查詢的結果再進行處理 values(*field): 返回一個ValueQuerySet對象,以字典序列的形式返回。 exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象,取反的意思 order_by(*field): 對查詢結果排序 reverse(): 對查詢結果反向排序 distinct(): 從返回結果中剔除重復紀錄 values_list(*field): 它返回的是一個元組序列。 ? count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。 first(): 返回第一條記錄 ?last(): 返回最后一條記錄 exists(): 如果QuerySet包含數據,就返回True,否則返回False,只查找到第一條數據就返回。 iterator():遍歷查詢數據庫數據 補充:django 數據庫的特點 1、django 數據庫的惰性機制? --.all()或者.filter()等都只是返回了一個QuerySet(查詢結果集對象),它并不會馬上執行sql,而是當調用QuerySet的時候才執行。 2、返回的QuerySet是個集合對象,可以對該對象進行可迭代查詢,也可以對其進行切片操作 3、由于惰性機制的原因,django數據庫會有一個cache緩存機制,同一時間內發送兩條相同的sql命令,第一條命令會從數據庫中獲取數據然后緩存到cache中,第二條命令就會在cache中獲取數據 4、當只是需要判定一個數據是否存在時就可以用exists()這個屬性進行判定,當查詢的數據過大時為了防止數據庫cache撐爆,可以在查詢條件的后面添加iterator()迭代屬性來迭代查詢。 5、 queryset的cache是用于減少程序對數據庫的查詢,在通常的使用下會保證只有在需要的時候才會查詢數據庫。 使用exists()和iterator()方法可以優化程序對內存的使用。不過,由于它們并不會生成queryset cache,可能會造成額外的數據庫查詢。 方式2:一對一查詢之正反向查詢 1、正向查詢格式: 外鍵表名稱.objects.filter(過濾條件).first().外鍵字段名稱.非外鍵表字段() 2、反向查詢格式: 非外鍵表名稱.objects.filter(過濾條件).last().外鍵表名.外鍵字段名()?? 方式3:一對多查詢之正反向查詢(通過x_set的方式就可以實現反向查詢,x指代的是外鍵名稱)
1、正向查詢:
外鍵表名稱.objects.filter(過濾條件).first().外鍵字段名稱.非外鍵表字段()
2、反向查詢:
非外鍵表名稱.objects.filter(過濾條件).last().外鍵表名__set.外鍵字段名()
????? 補充:反向查詢得到的是個集合對象,而正向查詢得到的是個對象。
了不起的雙下劃線之單表查詢
eg:表名.objects.filter(id__lt=10, id__gt=1) ? ? ? 獲取id大于1 且 小于10的值
表名.objects.filter(id__in=[11, 22, 33]) ? ? ?? 獲取id等于11、22、33的數據?
表名.objects.exclude(id__in=[11, 22, 33])????????? 獲取id不在列表內的數據,而not in是與之相反
表名.objects.filter(name__contains="x") ? ? ? ? ??? 獲取包含x字段的數據,
表名.objects.filter(name__icontains="ven")???? 獲取不區分大小寫的數據
? ?? 表名.objects.filter(id__range=[x, y]) ? ??????? 獲取id在x到y范圍內的數據
范圍bettwen and 、 startswith、istartswith、endswith、 iendswith,
了不起的雙下劃線(__)之多表條件關聯查詢
? 正向查找(條件)之一對多
格式:外鍵表名.objects.filter(過濾條件).values("外鍵名稱__非外鍵字段名")
正向查找(條件)之多對多
格式:外鍵表名.objects.filter(過濾條件).values("外鍵名稱__非外鍵字段名")
反向查找(條件)
反向查找之一對多
格式:非外鍵表名.objects.filter(外鍵表名__外鍵字段="外鍵字段值").values("非外鍵字段名")
反向查找之多對多:
格式:非外鍵表名.objects.filter(外鍵表名__外鍵字段="外鍵字段值").values("非外鍵字段名")
? 總結: 正向查找是先查表,查到的是個列表對象,然后再再連表,反向查找是先連表,連到的是個列表對象,然后再查表,查表是既可以查自己表中字段也可以查對端表中字段
3、向數據庫中刪除記錄 直接刪除(django默認支持級聯刪除,意思就是說只要刪除該記錄,該記錄對應的外鍵關系就會一并刪除) 注釋:表名.object.filter(過濾條件).具體操作,其中filter內寫的是你的過濾條件,id1是表字段,id2是前端模板傳遞過來的過濾條件值,過濾得到的結果是個列表,后面可以跟篩選條件([索引值]、first()、last()、delete())來進行具體操作 4、向數據庫更新一條數據 方式1:通過表名.filter(過濾條件).updae(表字段=值,表字段=值)的方式更新一條記錄或記錄內的某行內容 方式2:通過save()的方式來更新一條記錄內的某行內容 注釋:表名.filter(過濾條件).updae(表字段=值,表字段=值),其中過濾條件可以有多個用逗號隔開,格式為(表字段=值,表字段=值),過濾結果也是一個列表,可以通過篩選條件篩選出自己想要的某條記錄然后對其進行更新。 5、在settings中添加配置記錄數據庫操作 LOGGING = { 'version': 1, 'disable_existing_loggers': False, ? ??? 'handlers': { 'console':{ 'level':'DEBUG', ? ? ?'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, ? 'level':'DEBUG', }, } } 注釋:只要在settings配置文件的任意位置條件上這條記錄后,數據庫的所有操作都會被打印出來 7、聚合查詢和分組查詢1、聚合查詢 (aggregate),返回的是個字典形式的值
1、首先導入相應模板:from django.db.models import Avg,Min,Sum,Max
2、格式:表名稱.objects.[filter(過濾條件)].aggregate([x=]Avg('字段名')) 結果為: {x:值}
注釋:x指代的是個得到的結果的key鍵的名稱,如果不填寫就自動寫字段名作為key名稱
3、格式:表名稱.objects.filter(過濾條件).aggregate([x=]Avg('字段名1'),([x=]Min('字段名2'),([x=]Max('字段名3'))
注釋:如果想求多個值就可以用逗號隔開,得到的結果是個字典形式的集合,過濾條件既可以是正向查找也可以是反向查找,還可以
ge:
2、分組查詢( annotate()) 1、首先導入相應模板:from django.db.models import Avg,Min,Sum,Max 2、格式:表名稱.objects.[filter(過濾條件)].values(過濾條件).annotate(([x=]Avg('字段名'))
注釋:x指代的是個得到的結果的key鍵的名稱,如果不填寫就自動寫字段名作為key名稱
3、格式:表名稱.objects.[filter(過濾條件)].values(過濾條件).aggregate(([x=]Avg('字段名1'),([x=]Min('字段名2'),)
注釋:如果想求多個值就可以用逗號隔開,得到的結果是個字典形式的集合,過濾條件既可以是正向查找也可以是反向查找
ge:
8、F查詢和Q查詢
1、導入相應的模塊:from django.db.models import F,Q
2、F查詢主要是更新字段中的數據用:
格式:表名稱.object.[filter(過濾條件)].update(表字段名=F("表字段名")+值)
注釋:主要是對表字段中的數字進行操作的
eg:
3、Q查詢主要是應對多個條件的查詢,分別用& | ~ 操作符來作為多個條件之間的鏈接介質
格式:表名.objects.filter(Q(條件1) 操作符 Q(條件2) 操作符 Q(條件3),Q(條件4),條件5)?注釋:&和|可讓多個Q查詢合并成一個Q查詢,其中&表示且而|表示或,~表示取反,在所有的Q查詢末尾可以直接跟查詢條件,但是不能放在Q查詢之前。 eg: 9、創建外鍵方法(一對多記錄,且外鍵必須建立在多的那張表上,比如說一個出版署出版多本書,外鍵就建立在多的那張表上) 1、方式1:在建表的時候就已經創建好外鍵對應關系,插入記錄時就可以直接寫對端主鍵的值 利用ForeignKey(需要關聯的表名)方法來創建外鍵,注意在book類中創建的publish對象默認會在表中變成publish_id形式的字段
2、方式2:建表時沒有創建外鍵對應關系,插入記錄的時候創建外鍵對應關系,即寫對端對應的對象
1、需要先獲取被綁定的對象,也就是說創建的外鍵需要綁定那個對象
2、然后在需要綁定外鍵的記錄中將類中對應創建外鍵對象的值改為獲取的對象
10、創建外鍵方法(多對多記錄,第三張表綁定關系)
方式1:在建表的時候就已經創建好外鍵對應關系,因為是第三張表綁定關系,所以可以在任意第一張和第二張表中添加對應關系
通過ManyToManyField(第二張表名稱)的方式來創建,
django自己創建的第三張表,三個字段分別為第三張表主鍵,第一張表主鍵,第二張表主鍵
通過add(第一張表記錄1,第一張表記錄2...)的方式向第三張表中添加字段
注釋:首先需要得到第一張表中表多對多的記錄對象,然后得到第二張表中多對多的記錄對象,最后通過add的方式將兩張表多對多記錄添加到第三張表中(注意在那個類中添加多對多對象,就用那個表記錄對象 添加多對多記錄)
也可以通過添加列表的方式添加到第三張表中
方式2:在建表的時候沒有創建外鍵對象,需要自己創建第三張表添加多對多的外鍵
每個字段中都添加一對多的對應關系,然后就可以django中看見第三張表就可以對其進行具體的操作了。
通過添加具體的id的方式來創建兩個字段之間多對多的關系。
?
11、解除外鍵方法
1、方式1:正向刪除(通過clear()的方式來解除外鍵關系,以及通過remover(對象)的方式來刪除特定外鍵)
??
注釋:先寫出需要刪除外鍵關系的表記錄,然后再根據外鍵綁定對象來刪除相應 的對應關系
2、方式2:反向刪除()
注釋:先寫出非外鍵關系的表記錄,然后根據book_set反向查找從而刪除相應的對應關系
五、django的settings配置文件 1、添加靜態文件(每個獨立的項目都應該有相應的靜態文件) 注釋:appbook指的是你的項目文件名,static指的是項目下存放的靜態文件的文件夾名,其余不變 2、網頁引入靜態文件方式 ? 1 、將所有靜態文件放到一個static的文件夾中,該文件夾需要手動創建(叫什么名字無所謂,但是便于區分就叫static)?? ?
?? ? 2 、將static文件夾放到應用下,最好是一個項目對應一個static的文件夾
?? ?
?? ? 3 、在setting里面設置引入靜態文件的方式 STATIC_URL = '/static/'?? ?? 靜態文件的路徑別名,就是前段引入靜態文件時的名稱
?? ??? ? ?? STATIC_ROOT=(os.path.join(BASE_DIR,"appBook/static"),? )??? 添加上靜態文件的路徑,django才能找到
?? ??? ?
?? ? 4、 在模板首行加上{% load staticfiles %}??? 相當于讀取靜態文件配置
?? ?
?? 5 、 引入文件: {% static 具體路徑 %}???? 相當于引入靜態文件 注釋:static指的是靜態文件路徑別名,后面寫的是需要引入的文件 6、需要注意的事項: 注意1:為了后端的更改不會影響前端的引入,避免造成前端大量修改,在前段添加的都是引用名
STATIC_URL = '/static/' #引用名STATICFILES_DIRS = (os.path.join(BASE_DIR,"statics") ) #實際名 ,即實際文件夾的名字#django對引用名和實際名進行映射,引用時,只能按照引用名來,不能按實際名去找#<script src="/statics/jquery-3.1.1.js"></script>#------error----不能直接用,必須用STATIC_URL = '/static/'這個別名引用#<script src="/static/jquery-3.1.1.js"></script>注意2:statics文件夾寫在不同的app下,靜態文件的調用,意思就是說當settings需要引入多個靜態文件時,需要在每個靜態文件前加入一個元素。STATIC_URL = '/static/'STATICFILES_DIRS=(('hello',os.path.join(BASE_DIR,"app01","statics")), )#<script src="/static/hello/jquery-1.8.2.min.js"></script>注意3:要想在網頁模板中引入靜態文件就必須先讀取靜態文件,然后才能引用,且是通過別名引用。STATIC_URL = '/static/'
{% load staticfiles %}# <script src={% static "jquery-1.8.2.min.js" %}></script>
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/xuanan/p/7411083.html
總結
以上是生活随笔為你收集整理的django目录下的路由系统和视图函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用的oracle时间计算
- 下一篇: 非支配快速排序算法详解