網(wǎng)上有很多關(guān)于pos機(jī)圖模板,Django基礎(chǔ)三之路由的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)圖模板的問題,今天pos機(jī)之家(m.shineka.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
pos機(jī)圖模板
1. Django 請(qǐng)求和返回周期Django默認(rèn)使用wsgiref模塊但是該模塊并發(fā)量特別小(大約1000),不適用于線上環(huán)境,所以在Django項(xiàng)目上線之后會(huì)使用uwsgi。
1.1 路由層之路由匹配主要是在ursl.py文件里書寫。
1.11版本:urlpatterns = [ url('^admin/', admin.site.urls),]3.2版本:urlpatterns = [ path('admin/', admin.site.urls), path('test/', views.test), path('testadd/', views.testadd),]1版本中使用url方法:url()方法:1,第一個(gè)參數(shù)為一個(gè)正則2,只要能匹配上就會(huì)執(zhí)行后面的視圖函數(shù)3版本中使用pathpath()方法第一個(gè)參數(shù)是一個(gè)字符串如果使用正則,則要使用 re_path() 而不是 path() 。urlpatterns = [ re_path(r'^admin/', admin.site.urls),]test/和testadd/ 在匹配的時(shí)候如果不寫后面的斜杠(/),發(fā)現(xiàn)也能匹配上,是因?yàn)镈jango在做的時(shí)候如果test匹配不上,它會(huì)讓瀏覽器后面自動(dòng)加上斜杠(/)再試一次。這個(gè)是用settings里面的APPEND_SLASH參數(shù)控制,默認(rèn)為True,如果只想匹配一次則設(shè)置為False.APPEND_SLASH=False
在Django3.x在匹配時(shí)有了路徑轉(zhuǎn)換器:
str - 匹配除了 '/' 之外的非空字符串。如果表達(dá)式內(nèi)不包含轉(zhuǎn)換器,則會(huì)默認(rèn)匹配字符串。
int - 匹配 0 或任何正整數(shù)。返回一個(gè) int 。 path('articles/<int:year>/', views.year_archive), <int:year>是個(gè)整型參數(shù)
slug - 匹配任意由 ASCII 字母或數(shù)字以及連字符和下劃線組成的短標(biāo)簽。比如,building-your-1st-django-site 。
uuid - 匹配一個(gè)格式化的 UUID 。為了防止多個(gè) URL 映射到同一個(gè)頁(yè)面,必須包含破折號(hào)并且字符都為小寫。比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一個(gè) UUID 實(shí)例。
path - 匹配非空字段,包括路徑分隔符 '/' 。它允許你匹配完整的 URL 路徑而不是像 str 那樣匹配 URL 的一部分。
1.2 有名分組命名正則表達(dá)式組的語法是 (?P<name>pattern) 其中 name 是組名,pattern 是要匹配的模式
在Django3中路由匹配使用正則:ursl.py文件:from django.contrib import adminfrom django.urls import path,re_path #要手動(dòng)導(dǎo)入re_pathfrom orm import viewsurlpatterns = [ path('admin/', admin.site.urls), path('test/', views.test), path('testadd/', views.testadd), re_path(r'test/(?P<year>[0-9]{4})/', views.testadd),]在views.py:def testadd(request,year): print(year) return HttpResponse("from test")// 分組名必須要傳給后面的視圖函數(shù),否則會(huì)報(bào)錯(cuò)。如上面的例子,分組名為year,如果不傳給后端的views.testadd函數(shù),報(bào)錯(cuò)信息: testadd() got an unexpected keyword argument 'year' 有名分組將括號(hào)內(nèi)正則表達(dá)式匹配到的內(nèi)容當(dāng)做關(guān)鍵字參數(shù)傳遞給后面的視圖函數(shù)1.3 無名分組
有命名組語法,例如 (?P<year>[0-9]{4}) ,你也可以使用更短的未命名組,例如 ([0-9]{4}) 。
在Django3中路由匹配使用正則:ursl.py文件:from django.contrib import adminfrom django.urls import path,re_path #要手動(dòng)導(dǎo)入re_pathfrom orm import viewsurlpatterns = [ path('admin/', admin.site.urls), path('test/', views.test), path('testadd/', views.testadd), re_path(r'test/([0-9]{4})/$', views.test),]啟動(dòng)訪問: http://127.0.0.1:8000/test/1234/報(bào)錯(cuò): test() takes 1 positional argument but 2 were given解決方法:在views.py:def test(request,what): print(what) return HttpResponse("from test")再執(zhí)行訪問成功??刂婆_(tái)打印的結(jié)果:1234無名分組:將括號(hào)內(nèi)正則表達(dá)式匹配到的內(nèi)容當(dāng)做位置參數(shù)傳遞給后面的視圖函數(shù)。
總結(jié):
有名分組和無名分組不能混合使用。單個(gè)種類可以重復(fù)使用2. 反射解析當(dāng)路由頻繁變化的時(shí)候,HTML界面上的連接地址如何做到動(dòng)態(tài)解析。
"""1. 給路由與視圖函數(shù)對(duì)應(yīng)關(guān)系添加一個(gè)別名(名字自己定義,名字之間不要沖突)path('show/', views.show, name='showtime'),2. 根據(jù)這個(gè)別名動(dòng)態(tài)解析出一個(gè)結(jié)果,該結(jié)果可以直接訪問到對(duì)應(yīng)的路由前端使用別名:<a href="{% url 'showtime' %}"><h1>Hello Django</h1></a>這樣不管path里面的show怎么變,只要name='showtime'不變,那么訪問就沒問題 后端使用別名:ursl.py:urlpatterns = [path('show/', views.show, name='showtime'),]views.pyfrom django.shortcuts import render, HttpResponse,redirect,reversedef delete(request):......print(reverse('showtime')) # 打印urlreturn redirect('showtime') # 也可以直接在重定向里寫別名"""
無名和有名分組指向解析
ursl.py"""from django.urls import path,re_pathurlpatterns = [re_path(r'test/([0-9]{4})/$', views.test, name='index_test'),]"""views.py"""def delete(request):......print(reverse('index_test',args=(1,))) # 打印urlargs=(1,) args后面跟一個(gè)元組,里面這寫的是1,推薦寫主鍵的值r'test/([0-9]{4})/([0-9]{4})/$ 如果有兩個(gè)分組,則args后面必須寫兩個(gè)值,(1,2)第二個(gè)值可以隨便寫"""前端也一樣:<a href="{% url 'index_test' 123 %}"><h1>Hello Django</h1></a>這里123也是隨便寫的,只要寫個(gè)數(shù)字就行有名:后端reverse('index_test',kwargs={'id':123})前端<a href="{% url 'index_test' id=123 %}"><h1>Hello Django</h1></a>
總結(jié)
無名和有名都可以使用一種(無名)反向解析的形式
3. 路由分發(fā)其實(shí)Django中的每一個(gè)應(yīng)用都可以有自己的urls.py、static文件夾、templates文件夾,這樣使用Django做分組開發(fā)非常的簡(jiǎn)便。每個(gè)人只需要寫息的應(yīng)用即可,最后匯總到一個(gè)空的Django項(xiàng)目中然后使用路由分發(fā)將多個(gè)應(yīng)用關(guān)聯(lián)。
示例:
創(chuàng)建一個(gè)項(xiàng)目,并創(chuàng)建兩個(gè)應(yīng)用(app01,app02).在每個(gè)應(yīng)用里面都創(chuàng)建一個(gè)urls.py文件。app01 urls.py:"""from django.urls import pathfrom app01 import viewsurlpatterns = [ path('index', views.index),]"""app01 views.py:"""from django.shortcuts import render,HttpResponse# Create your views here.def index(request): return HttpResponse("from app01 index")"""app02 urls.py:"""from django.urls import pathfrom app02 import viewsurlpatterns = [ path('index', views.index),]"""app02 views.py:"""from django.shortcuts import render,HttpResponse# Create your views here.def index(request): return HttpResponse("from app02 index")"""項(xiàng)目中總的urls.py:"""from django.contrib import adminfrom django.urls import path,include# 導(dǎo)入應(yīng)用的urlsfrom app01 import urls as app01_urlsfrom app02 import urls as app02_urlsurlpatterns = [ path('admin/', admin.site.urls), path('app01/', include(app01_urls)), path('app02/', include(app02_urls)),]"""注意:需要在總的urls.py里導(dǎo)入includefrom django.urls import path,include在總的路由里面不能加$符號(hào),否則沒辦法分發(fā)還有一種在總的urls.py里不需要導(dǎo)入應(yīng)用urlsr 的方法: 項(xiàng)目中總的urls.py: """from django.contrib import adminfrom django.urls import path,includeurlpatterns = [ path('admin/', admin.site.urls), path('app01/', include('app01.urls')), path('app02/', include('app02.urls')),]"""4 名稱空間
當(dāng)多個(gè)應(yīng)用在反射解析的時(shí)候如果出現(xiàn)了別名沖突的情況,那么將會(huì)無法自動(dòng)識(shí)別
示例:
app01 urls.py:"""from django.urls import pathfrom app01 import viewsurlpatterns = [ path('index', views.index,name='index_name'), path('login', views.login)]"""app01 views.py:"""from django.shortcuts import render,HttpResponse,reverse# Create your views here.def index(request): return HttpResponse("from app01 index")def login(request): print(reverse('index_name')) return HttpResponse("from app01 login")"""app02 urls.py:"""from django.urls import pathfrom app02 import viewsurlpatterns = [ path('index', views.index,name='index_name'), path('login', views.login),]"""app02 views.py:"""from django.shortcuts import render,HttpResponse,reverse# Create your views here.def index(request): return HttpResponse("from app02 index")def login(request): print(reverse('index_name')) return HttpResponse("from app02 login")"""項(xiàng)目中總的urls.py: """from django.contrib import adminfrom django.urls import path,includeurlpatterns = [ path('admin/', admin.site.urls), path('app01/', include('app01.urls')), path('app02/', include('app02.urls')),]"""雖然訪問頁(yè)面:http://127.0.0.1:8000/app01/loginhttp://127.0.0.1:8000/app02/login的時(shí)候能正常拿到對(duì)應(yīng)的頁(yè)面,但是在后端發(fā)現(xiàn)拿到的是同一個(gè):/app02/index/app02/index
要解決這個(gè)問題就用到了名稱空間
解決方法一:使用名稱空間
在總路上加上namespace這個(gè)參數(shù):項(xiàng)目中總的urls.py: """from django.contrib import adminfrom django.urls import path,includeurlpatterns = [ path('admin/', admin.site.urls),path('app01/', include('app01.urls',namespace='app01')), path('app02/', include('app02.urls',namespace='app02')),]"""app01 urls.py:"""from django.urls import pathfrom app01 import viewsapp_name='app01'urlpatterns = [ path('index', views.index,name='index_name'), path('login', views.login)]"""app01 views.py:"""from django.shortcuts import render,HttpResponse,reverse# Create your views here.def index(request): return HttpResponse("from app01 index")def login(request): print(reverse('app01:index_name')) return HttpResponse("from app01 login")"""app02 urls.py:"""from django.urls import pathfrom app02 import viewsapp_name='app02'urlpatterns = [ path('index', views.index,name='index_name'), path('login', views.login),]"""app02 views.py:"""from django.shortcuts import render,HttpResponse,reverse# Create your views here.def index(request): return HttpResponse("from app02 index")def login(request): print(reverse('app02:index_name')) return HttpResponse("from app02 login")"""訪問頁(yè)面:http://127.0.0.1:8000/app01/loginhttp://127.0.0.1:8000/app02/login拿到的就是/app01/index/app02/index注意在Django3.2版本中使用名稱空間的時(shí)候,一定要給每個(gè)應(yīng)用設(shè)置應(yīng)用名,否則會(huì)報(bào)錯(cuò):'''pecifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.'''解決方法:app01 urls.py:'''app_name='app01''''app02 urls.py:'''app_name='app02''''這兩個(gè)必須要設(shè)置。
前端使用名稱空間:
<a href="{% url 'app01:index_name' %}">app01_index</a><a href="{% url 'app02:index_name' %}">app02_index</a>
注意:
雖然我們現(xiàn)在可以將模板文件直接放在 app01/templates 文件夾中(而不是再建立一個(gè) app01 子文件夾),但是這樣做不太好。Django 將會(huì)選擇第一個(gè)匹配的模板文件,如果你有一個(gè)模板文件正好和另一個(gè)應(yīng)用中的某個(gè)模板文件重名,Django 沒有辦法 區(qū)分 它們。我們需要幫助 Django 選擇正確的模板,最好的方法就是把他們放入各自的 命名空間 中,也就是把這些模板放入一個(gè)和 自身 應(yīng)用重名的子文件夾里。(app01/templates/app01/login.HTML)
同理:多個(gè)應(yīng)用下的靜態(tài)文件也是這樣。
所以在前端使用名稱空間的時(shí)候,HTML文件的路徑為:
app01/templates/app01/login.htmlapp02/templates/app02/login.html后端app01 views.py:from django.shortcuts import render,HttpResponse,reversedef login(request): print(reverse('app01:index_name')) return render(request, "app01/login.html")后端app02 views.py:from django.shortcuts import render,HttpResponse,reversedef login(request): print(reverse('app02:index_name')) return render(request, "app02/login.html")
解決方法二:別名別沖突
寫別名的時(shí)候要加上自己應(yīng)用名做前綴。
5. jsonResponse給前端返回一個(gè)json格式的數(shù)據(jù)
方法一:自己序列化
views.py: from django.shortcuts import render,HttpResponse,reverseimport Jsondef index(request): d = {'user':'Hans', 'password':123} d_json = json.dumps(d) return HttpResponse(d_json)# json默認(rèn)不能直接識(shí)別的字符直接返回對(duì)應(yīng)的unicode編碼,如上面的漢字要正確返回則需要設(shè)置ensure_ascii=Falsed = {'user':'Hans你好', 'password':123}d_json = json.dumps(d,ensure_ascii=False)
方法二: 使用JsonResponse
views.py: from django.shortcuts import render,HttpResponse,reversefrom django.http import JsonResponsedef index(request): d = {'user':'Hans', 'password':123} return JsonResponse(d)# JsonResponse 對(duì)不能識(shí)別的字符也是直接返回unicode編碼,如果對(duì)漢字也能正常展示,加上json_dumps_params={'ensure_ascii':False}參數(shù):d = {'user':'Hans你好', 'password':123}return JsonResponse(d,json_dumps_params={'ensure_ascii':False})# 如果序列化一個(gè)非字典類型的,則需要讓safe=False如:li = ['A','B','C']return JsonResponse(d, safe=Fasle)6. 上傳文件
前端頁(yè)面: <form action="" method="post" enctype="multipart/form-data" class="form-control"> <p><input type="file" name="files"></p> <p><input type="submit" value="提交" ></p> </form># 路由層:path('upfile', views.upfile),# 視圖層views.py:from django.shortcuts import render,HttpResponse,reversedef upfile(request): if request.method == 'POST': file_obj = request.FILES.get('files') print(file_obj.name) with open(r'./app01/templates/%s' % file_obj.name, 'wb') as f: for chunk in file_obj.chunks(): f.write(chunk) return render(request,"app01/upfile.html")7. FBV和CBV
FBV:基于函數(shù)的視圖
CBV:基于類的視圖
上面寫的都為FBV,基于函數(shù)的視圖,現(xiàn)在寫一個(gè)基于類的視圖。
# views.pyfrom django.shortcuts import render,HttpResponse,reversefrom django.views import Viewclass MyView(View): def get(self,request): return HttpResponse("GET方法") def pos(self,request): return HttpResponse("POST方法") # urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [ path('myview', views.MyView.as_view()),]#CBV和FBV路由匹配其實(shí)是一樣的。8. 模板語法傳值8.1 傳基本數(shù)據(jù)類型
# 方法一:精確傳值# urls.py""" from django.contrib import adminfrom django.urls import pathfrom templateByValue import viewsurlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index),]""" # 前端HTML:""" <body><ul>{{ i }}</ul><ul>{{ f }}</ul><ul>{{ str }}</ul><ul>{{ Li }}</ul><ul>{{ set01 }}</ul><ul>{{ t }}</ul><ul>{{ bool_value }}</ul><ul>{{ d }}</ul></body>""" views.py:""" from django.shortcuts import render# Create your views here.def index(request): i = 123 f = 12.3 str = "Hello Django" Li = [1, 2, 3] d = {'username':"Hans", "age":19} t = (1, 2, 3, 4) set01 = {1, 2, 3, 4} bool_value = True return render(request,'index.html',{"i":i,"f":f,"str":str,"Li":Li,"d":d,'t':t, "set01":set01,'bool_value':bool_value})""" # 方法二:使用locals函數(shù)# 在views.py 中給前端頁(yè)面?zhèn)髦得總€(gè)都要寫,在值特別多的時(shí)候不方便,可以使用locals函數(shù)""" return render(request,"index.html",locals())"""locals() 獲取全部局部變量:{'request': <WSGIRequest: GET '/index/'>, 'i': 123, 'f': 12.3, 'str': 'Hello Django', 'Li': [1, 2, 3], 'd': {'username': 'Hans', 'age': 19}, 't': (1, 2, 3, 4), 'set01': {1, 2, 3, 4}, 'bool_value': True},然后全部傳給前端頁(yè)面。兩者的優(yōu)缺點(diǎn): 方法一,可以精確傳值,不會(huì)造成資源浪費(fèi),但傳的值多的時(shí)候書寫不方便 方法二, 書寫方便,但是會(huì)造成資源浪費(fèi)。8.2 傳函數(shù)名
# 前端:"""<body><p>{{ foo }}</p></body>"""# views.py:"""from django.shortcuts import render# Create your views here.# 定義函數(shù)def index(request): def foo(): print("hello") return "Hello Django" return render(request,"index.html",{"foo":foo}) # 給前端傳遞,前面拿到的是函數(shù)的返回值。"""使用模板語法傳函數(shù)的時(shí)候,不支持帶參數(shù)8.3 傳類名
# 前端:"""<body><p>{{ MyClass }}</p><p>{{ obj }}</p><p>{{ obj.get_self }}</p><p>{{ obj.get_cls }}</p><p>{{ obj.get_static }}</p></body>"""#views.py"""from django.shortcuts import render# Create your views here.def index(request): class MyClass(object): def get_self(self): return "綁定給對(duì)象的方法" @classmethod def get_cls(cls): return "綁定給類的方法" @staticmethod def get_static(): return "普通的函數(shù)" obj = MyClass() print(locals()) return render(request,"index.html",{"MyClass":MyClass,"obj":obj})"""或直接寫:return render(request,"index.html",locals())
總結(jié)
傳遞函數(shù)名和類名都會(huì)自動(dòng)加括號(hào)調(diào)用(模板語法不支持額外的傳參數(shù))
9. 模板語法獲取值Django中模板語法取值只用.
# views.py"""from django.shortcuts import render# Create your views here.def index(request): Li = [1, 2, 3] d = {'username':"Hans", "age":19} return render(request,'index.html',locals())""" # 前端:"""<ul>{{ Li.1}</ul> 拿列表第二個(gè)值<ul>{{ set01.age}}</ul> 拿年齡"""10. 模板語法過濾器
過濾器的符號(hào)是管道符:|,將管道符左側(cè)的數(shù)據(jù)當(dāng)做第一個(gè)參數(shù)。
# views.py:"""from django.shortcuts import render# Create your views here.def index(request): i = 123 str = "Hello Django" Li = [1, 2, 3] d = {'username':"Hans", "age":19} bool_value = True bool_var = False import datetime ctime = datetime.datetime.now() file_size = 409600 h = "<h1>Hello</h1>" from django.utils.safestring import mark_safe h1 =mark_safe("<h1>Django</h1>") #后端也可以直接寫HTML語法返回給前端了 return render(request,"index.html",locals())"""# 前端:"""<body><p>過濾器:將管道符左側(cè)的數(shù)據(jù)當(dāng)做第一個(gè)參數(shù)</p><p>統(tǒng)計(jì)長(zhǎng)度:{{ str|length }}</p><p>加法:{{ i|add:10000 }}</p><p>字符串拼接:{{ str|add:"HAHA" }}</p><p>日期格式:{{ ctime|date:"Y-m-d" }}</p><p>默認(rèn)值:{{ bool_value|default:"哈哈" }}</p><p>默認(rèn)值:{{ bool_var|default:"哈哈" }}</p><p>文件大小:{{ file_size|filesizeformat }}</p><p>截取文本(截6個(gè)字符,包括3個(gè)點(diǎn)):{{ str|truncatechars:6 }}</p><p>截取文本(截1個(gè)單詞,不包括3個(gè)點(diǎn)):{{ str|truncatewords:1 }}</p><p>h源信息:{{ h }}</p><p>前端把后端傳過來的數(shù)據(jù)(h),格式成HTML格式: {{ h|safe }}</p><p>后端傳過來的數(shù)據(jù)(h1)直接為HTML格式顯示: {{ h1 }}</p></body>"""11. 模板語法標(biāo)簽(流程控制)
# if {% if var %} <p>good</p>{% endif %}# if else{% if bool_var %} <p>var</p>{% else %} <p>valu</p>{% endif %}# if ... elif ... else {% if bool_var %} <p>var</p>{% elif bool_value %} <p>value</p>{% else %} <p>都沒有</p>{% endif %}# for{% for foo in Li %} <p>foo</p>{% endfor %}# for內(nèi)可以嵌套if{% for foo in Li %} <p>foo</p> {% empty %} # 如果是空的時(shí)候,打印empty里的 <p>空值</p>{% endfor %}# forloop 打印循環(huán)次數(shù){% for foo in Li %} <p>foo</p> <p>{{forloop.counter}}{% endfor %}{{}} 變量相關(guān)的用{%%} 邏輯相關(guān)的用# with {% with d.3.username as name %} # 給d.3.username起別名 {{ name }}{% endwith %}這個(gè)別名只能在with里面用。12. 自定義過濾器、標(biāo)簽、inclusion_tag
類似于python里面的自定義函數(shù)
1. 在應(yīng)用下創(chuàng)建一個(gè)名字必須叫"templatetags"文件夾2, 在上述文件夾內(nèi)創(chuàng)建一個(gè)任意名稱的py文件3, 在該py文件內(nèi)固定寫入:from django import template register = template.Library()12.1 自定義過濾器:
示例:
1,在應(yīng)用下創(chuàng)建templatetags文件夾2,在templatetags夾里創(chuàng)建myFilter.py文件內(nèi)容:"""from django import templateregister = template.Library()@register.filter(name="My") # 過濾器名def index(a,b): return a+b"""3, views.pyfrom django.shortcuts import renderdef index(request): i = 123 return render(request,"index.html",locals())4,前端頁(yè)面: <div> {% load myFilter %} <p>{{ i |My:100}}</p> </div> 5. 瀏覽器顯示結(jié)果:223
過濾器只能接受兩個(gè)參數(shù)。
12.2 自定義標(biāo)簽1, 依然是在myFilter.py文件里:"""from django import templateregister = template.Library()@register.simple_tag(name='myTag') # 標(biāo)簽名def foo(a,b,c,d): return "{%s:%s %s:%s}" % (a,b,c,d)"""2, 前端頁(yè)面:"""<div> {% load myFilter %} {% myTag 1 "hans" 2 "Hello" %} # 標(biāo)簽傳值使用空格分隔</div>"""
標(biāo)簽可以接受多個(gè)參數(shù)
12.3 自定義inclusion_tag前面自定義的過濾器和標(biāo)簽,都是自定義的過濾器函數(shù)和標(biāo)簽函數(shù)直接返回給前端,自定義inclusion_tag有些不同。
在myFilter.py文件里:from django import templateregister = template.Library() @register.inclusion_tag('login.html', name="myInclusion") # inclusion_tag名字 def foo2(n): l =[] for i in range(1, n+1): l.append("第%s頁(yè)" % i) return locals()# login.html<ul> {% for foo in l %} <li>{{ foo }}</li> {% endfor %}</ul># 前端頁(yè)面:<div> {% load myFilter %} {% myInclusion 4 %}</div>結(jié)果: 第1頁(yè) 第2頁(yè) 第3頁(yè) 第4頁(yè)
總結(jié):
前端要使用自定義過濾器,標(biāo)簽和inclusion_tag都先要load.
在某個(gè)區(qū)域需要反復(fù)使用并且數(shù)據(jù)不固定,適合使用inclusion_tag.
13. 模板的導(dǎo)入類似于python導(dǎo)模塊
例如有一個(gè)頁(yè)面會(huì)經(jīng)常用到,不可能每次用到就寫一份,可以使用模板導(dǎo)入的方法。
頁(yè)面導(dǎo)入模板關(guān)鍵字:{%include%}
經(jīng)常用到的頁(yè)面form.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body><div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <form> <div class="form-group"> <label for="exampleInputEmail1">Email address</label> <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email"> </div> <div class="form-group"> <label for="exampleInputPassword1">Password</label> <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> </div> </div></div></body></html>
模板導(dǎo)入:
需要用到模板的頁(yè)面:index.html<body> <div> {% include 'form.html' %} </div> </body>14. 模板的繼承
示例:
主頁(yè)home.html(模板)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head><body><div class="container"> <div class="row"> <nav class="navbar navbar-inverse"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Brand</a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> <li role="separator" class="divider"></li> <li><a href="#">One more separated link</a></li> </ul> </li> </ul> <form class="navbar-form navbar-left"> <div class="form-group"> <input type="text" class="form-control" placeholder="Search"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <ul class="nav navbar-nav navbar-right"> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> <li><a href="#">Something else here</a></li> <li role="separator" class="divider"></li> <li><a href="#">Separated link</a></li> </ul> </li> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> <!--左側(cè)--> <div class="list-group col-md-2"> <a href="#" class="list-group-item active"> Cras justo odio </a> <a href="/compute/" class="list-group-item">電腦</a> <a href="/phone/" class="list-group-item">手機(jī)</a> <a href="/beauty/" class="list-group-item">beauty</a> <a href="#" class="list-group-item">Vestibulum at eros</a> </div> <!--右側(cè)--> {% block content %} <div class="jumbotron col-md-10"> <h1>Hello, world!</h1> <p>...</p> <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p> </div> {% endblock %} </div></div></body></html><!--{% block content %} 這個(gè)區(qū)域做了標(biāo)記,這個(gè)區(qū)域是可以修改的。content 這個(gè)名字可以隨意起{% endblock %}-->
電腦(compute.html)頁(yè)面繼承home.html
{% extends 'home.html' %}{% block content %}<div class="row"> <div class="col-xs-6 col-md-3"> <a href="https://www.apple.com.cn/shop/buy-mac/macbook-pro/MK1A3CH/A" class="thumbnail"> <img src="https://store.storeimages.cdn-apple.com/8756/as-images.apple.com/is/mbp16-spacegray-gallery1-202110_GEO_CN?wid=4000&hei=3072&fmt=jpeg&qlt=80&.v=1633656602000"> </a> </div></div>{% endblock %}<!--{% extends 'home.html' %} 繼承home.html{% block content %}這個(gè)區(qū)域?qū)慼omecompute自己的內(nèi)容{% endblock %}-->
手機(jī)(phone.html)頁(yè)面繼承home.html
{% extends 'home.html' %}{% block content %}<div class="row"> <div class="col-xs-6 col-md-3"> <a href="#" class="thumbnail"> <img src="https://gimg2.baidu.com/image_search/src=http://exp-picture.cdn.bcebos.com/27725684cde34b2ca90aafca0d0e7c75e4f4437e.jpg?x-bce-process=image/resize,m_lfit,w_500,limit_1&refer=http://exp-picture.cdn.bcebos.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1648558900&t=4b7021e3f90edeb7bf92842b1df965cb"> </a> </div></div>{% endblock %}
子模板不但能修改被標(biāo)記的位置,還可以使用模板內(nèi)容:
{% extends 'home.html'%}{% block content %}<div class="row"> <div class="col-xs-6 col-md-3"> <a href="#" class="thumbnail"> <img src="https://gimg2.baidu.com/image_search/src=http://img.jj20.com/up/allimg/4k/s/02/2110021F21V024-0-lp.jpg&refer=http://img.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1648559897&t=c5b2a29fac9a42cb0f7019ea13b40d21"> </a> </div></div> {{ block.super }}{% endblock %}<!-- {{ block.super }} 為模板內(nèi)被標(biāo)記的區(qū)域-->
模板在標(biāo)記區(qū)域的時(shí)候一般有三個(gè)區(qū)域
CSS區(qū)域HTML區(qū)域JS區(qū)域目的是為了讓繼承的子模板具有獨(dú)立的CSS和JS,增加擴(kuò)展性
<head> {% balock css %} css 樣式 {% endblock %}</head><body> {% balock html %} html內(nèi)容 {% endblock %} {% balock js %} js 內(nèi)容 {% endblock %}</body>子板也可以使用模板標(biāo)記的區(qū)域的內(nèi)容: {{ block.super }}
以上就是關(guān)于pos機(jī)圖模板,Django基礎(chǔ)三之路由的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)圖模板的知識(shí),希望能夠幫助到大家!
