django ajax 更新表格_Django(反向解析,路由分发、名称空间、视图层、虚拟环境、Django版本、json,CBV)...
生活随笔
收集整理的這篇文章主要介紹了
django ajax 更新表格_Django(反向解析,路由分发、名称空间、视图层、虚拟环境、Django版本、json,CBV)...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.zhihu.com/video/1249117508688711680
每日測驗
""" 今日考題 1.列舉你知道的orm數據的增刪改查方法 2.表關系如何判定,django orm中如何建立表關系,有什么特點和注意事項 3.請畫出完整的django請求生命周期流程圖 4.無名、有名分組各是什么意思 5.反向解析是什么,如何使用, """答案
1.列舉你知道的orm數據的增刪改查方法查:models.User.objects.filter() / models.User.objects.all() 增:models.User.objects.create() 改:models.User.objects.filter(條件).update(數據) 刪:models.User.objects.filter(條件).delete()2.表關系如何判定,django orm中如何建立表關系,有什么特點和注意事項一對多:models.ForeignKey(to='表') 建在多的一方 一對一:models.OneToOneFiled(to='表') 建在查詢頻率高的一方 多對多:models.ManyToManyFiled(to='表') 會給外鍵自動加上_id后綴 在django1.x中是級聯更新級聯刪除的 在2.x,3.x中需要加一段代碼讓他們級聯更新級聯刪除 models.FoerignKey(to='表', on_delete=models.CASCADE)3.請畫出完整的django請求生命周期流程圖4.無名、有名分組各是什么意思無名有名分組都是在urls.py文件中書寫的, 目的是將括號內正則表達式匹配到的內容傳遞給視圖函數 無名:url(r'^/(d+)/') 這里面的d+是無名,形式是位置參數 有名:url(r'^/(?P<kwargs>d+)/') 這里面是有名,關鍵字參數5.反向解析是什么,如何使用,反向解析就是動態解析,給前后端傳參數用的,能把前端的東西返回給 后端,可以用一個名字代替函數 url('^func1/(d+)/', views.func, name='xxx) 前端 <a href="{% url 'xxx' user_obj.id %}"></a> 這樣就可以動態觸發func1 后端 from django.shortcuts import reverse def func(request, edit_id):reveser('xxx', (edit_id, )) 這樣可以拿到主鍵值 直接使用edit_obj = models.User.objects.filter(id=edit_id).first()內容回顧
- 數據的編輯和刪除
- 圖書管理系統表設計(orm創建表關系)
- django請求生命周期流程圖
- 路由分發
- 無名有名分組
- 反向解析
今日內容概要
- 無名有名分組反向解析
- 路由分發
- 名稱空間(了解)
- 偽靜態(了解)
- 虛擬環境(了解)
- django1.X和django2.X的區別(了解)
- 視圖層
- 三板斧
- JsonResponse
- form表單上傳文件
- request方法
- FBV(function based view)與CBV(class based view)
(視圖函數既可以是函數也可以是類)
內容詳細
無名有名分組反向解析
# 無名分組反向解析url(r'^index/(d+)/',views.index,name='xxx')# 前端{% url 'xxx' 123 %} # 后端reverse('xxx', args=(1,))""" 這個數字寫代碼的時候應該放什么數字一般情況下放的是數據的主鍵值 數據的編輯和刪除url(r'^edit/(d+)/',views.edit,name='xxx')def edit(request,edit_id):reverse('xxx',args=(edit_id,)){%for user_obj in user_queryset%}<a href="{% url 'xxx' user_obj.id %}">編輯</a>{%endfor%}今天每個人都必須完成的作業(*******)利用無名有名 反向解析 完成數據的增刪改查 """# 有名分組反向解析url(r'^func/(?P<year>d+)/',views.func,name='ooo') # 前端<a href="{% url 'ooo' year=123 %}">111</a> 了解<a href="{% url 'ooo' 123 %}">222</a> 記憶# 后端 # 有名分組反向解析 寫法1 了解print(reverse('ooo',kwargs={'year':123}))# 簡便的寫法 減少你的腦容量消耗 記跟無名一樣的操作即可print(reverse('ooo',args=(111,)))路由分發
""" django的每一個應用都可以有自己的templates文件夾 urls.py static文件夾 正是基于上述的特點 django能夠非常好的做到分組開發(每個人只寫自己的app) 作為組長 只需要將手下書寫的app全部拷貝到一個新的django項目中 然后在配置文件里面注冊所有的app再利用路由分發的特點將所有的app整合起來當一個django項目中的url特別多的時候 總路由urls.py代碼非常冗余不好維護 這個時候也可以利用路由分發來減輕總路由的壓力利用路由分發之后 總路由不再干路由與視圖函數的直接對應關系 而是做一個分發處理識別當前url是屬于哪個應用下的 直接分發給對應的應用去處理"""# 總路由 from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [url(r'^admin/', admin.site.urls),# 1.路由分發url(r'^app01/',include(app01_urls)), # 只要url前綴是app01開頭 全部交給app01處理url(r'^app02/',include(app02_urls)) # 只要url前綴是app02開頭 全部交給app02處理# 2.終極寫法 推薦使用url(r'^app01/',include('app01.urls')),url(r'^app02/',include('app02.urls'))# 注意事項:總路由里面的url千萬不能加$結尾 ]# 子路由# app01 urls.pyfrom django.conf.urls import urlfrom app01 import viewsurlpatterns = [url(r'^reg/',views.reg)]# app02 urls.pyfrom django.conf.urls import urlfrom app02 import viewsurlpatterns = [url(r'^reg/',views.reg)]名稱空間(了解)
# 當多個應用出現了相同的別名 我們研究反向解析會不會自動識別應用前綴 """ 正常情況下的反向解析是沒有辦法自動識別前綴的 """# 名稱空間# 總路由url(r'^app01/',include('app01.urls',namespace='app01')),url(r'^app02/',include('app02.urls',namespace='app02'))# 解析的時候# app01urlpatterns = [url(r'^reg/',views.reg,name='reg')]# app02urlpatterns = [url(r'^reg/',views.reg,name='reg')]reverse('app01:reg')reverse('app02:reg'){% url 'app01:reg' %}{% url 'app02:reg' %} # 其實只要保證名字不沖突 就沒有必要使用名稱空間 """ 一般情況下 有多個app的時候我們在起別名的時候會加上app的前綴 這樣的話就能夠確保多個app之間名字不沖突的問題 """ urlpatterns = [url(r'^reg/',views.reg,name='app01_reg') ] urlpatterns = [url(r'^reg/',views.reg,name='app02_reg') ]偽靜態(了解)
""" 靜態網頁數據是寫死的 萬年不變偽靜態將一個動態網頁偽裝成靜態網頁為什么要偽裝呢?https://www.cnblogs.com/Dominic-Ji/p/9234099.html偽裝的目的在于增大本網站的seo查詢力度并且增加搜索引擎收藏本網上的概率搜索引擎本質上就是一個巨大的爬蟲程序總結:無論你怎么優化 怎么處理始終還是干不過RMB玩家 """ urlpatterns = [url(r'^reg.html',views.reg,name='app02_reg') ]虛擬環境(了解)
""" 在正常開發中 我們會給每一個項目配備一個該項目獨有的解釋器環境 該環境內只有該項目用到的模塊 用不到一概不裝linux:缺什么才裝什么虛擬環境你每創建一個虛擬環境就類似于重新下載了一個純凈的python解釋器但是虛擬環境不要創建太多,是需要消耗硬盤空間的擴展:每一個項目都需要用到很多模塊 并且每個模塊版本可能還不一樣那我該如何安裝呢? 一個個看一個個裝???開發當中我們會給每一個項目配備一個requirements.txt文件里面書寫了該項目所有的模塊即版本你只需要直接輸入一條命令即可一鍵安裝所有模塊即版本 """django版本區別
""" 1.django1.X路由層使用的是url方法而在django2.Xhe3.X版本中路由層使用的是path方法url()第一個參數支持正則path()第一個參數是不支持正則的 寫什么就匹配什么如果你習慣使用path那么也給你提供了另外一個方法from django.urls import path, re_pathfrom django.conf.urls import urlre_path(r'^index/',index),url(r'^login/',login)2.X和3.X里面的re_path就等價于1.X里面的url2.雖然path不支持正則 但是它的內部支持五種轉換器path('index/<int:id>/',index)# 將第二個路由里面的內容先轉成整型然后以關鍵字的形式傳遞給后面的視圖函數def index(request,id):print(id,type(id))return HttpResponse('index')str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式int,匹配正整數,包含0。slug,匹配字母、數字以及橫杠、下劃線組成的字符串。uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)3.除了有默認的五個轉換器之外 還支持自定義轉換器(了解)class MonthConverter:regex='d{2}' # 屬性名必須為regexdef to_python(self, value):return int(value)def to_url(self, value):return value # 匹配的regex是兩個數字,返回的結果也必須是兩個數字from django.urls import path,register_converterfrom app01.path_converts import MonthConverter# 先注冊轉換器register_converter(MonthConverter,'mon')from app01 import viewsurlpatterns = [path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'),]4.模型層里面1.X外鍵默認都是級聯更新刪除的 但是到了2.X和3.X中需要你自己手動配置參數models.ForeignKey(to='Publish')models.ForeignKey(to='Publish',on_delete=models.CASCADE...) """視圖層
三板斧
""" HttpResponse返回字符串類型 render返回html頁面 并且在返回給瀏覽器之前還可以給html文件傳值 locals() redirect重定向 '/網址/' """ # 視圖函數必須要返回一個HttpResponse對象 正確 研究三者的源碼即可得處結論 The view app01.views.index didn't return an HttpResponse object. It returned None instead.# render簡單內部原理from django.template import Template,Contextres = Template('<h1>{{ user }}</h1>')con = Context({'user':{'username':'jason','password':123}})ret = res.render(con)print(ret)return HttpResponse(ret)JsonResponse對象
""" json格式的數據有什么用?前后端數據交互需要使用到json作為過渡 實現跨語言傳輸數據前端序列化JSON.stringify() json.dumps()JSON.parse() json.loads() """ import json from django.http import JsonResponse def ab_json(request):user_dict = {'username':'jason好帥哦,我好喜歡!','password':'123','hobby':'girl'}l = [111,222,333,444,555]# 先轉成json格式字符串# json_str = json.dumps(user_dict,ensure_ascii=False)# 將該字符串返回# return HttpResponse(json_str)# 讀源碼掌握用法# return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})# In order to allow non-dict objects to be serialized set the safe parameter to False.# return JsonResponse(l,safe=False) # 默認只能序列化字典 序列化其他需要加safe參數form表單上傳文件及后端如何保存
""" form表單上傳文件類型的數據1.method必須指定成post2.enctype必須換成formdata""" def ab_file(request):if request.method == 'POST':# print(request.POST) # 只能獲取普通的鍵值對數據 文件不行print(request.FILES) # 獲取文件數據 # <MultiValueDict: {'file': [<InMemoryUploadedFile: u=1288812541,1979816195&fm=26&gp=0.jpg (image/jpeg)>]}>file_obj = request.FILES.get('file') # 文件對象print(file_obj.name)with open(file_obj.name,'wb') as f:for line in file_obj.chunks(): # 推薦加上chunks方法 其實跟不加是一樣的都是一行行的讀取f.write(line)return render(request,'form.html')request對象方法
""" request.method request.POST request.GET request.FILES request.body # 原生的瀏覽器發過來的二進制數據 后面詳細的講 request.path request.path_info request.get_full_path() 能獲取完整的url及問號后面的參數 """print(request.path) # /app01/ab_file/print(request.path_info) # /app01/ab_file/print(request.get_full_path()) # /app01/ab_file/?username=jasonFBV與CBV
# 視圖函數既可以是函數也可以是類 def index(request):return HttpResponse('index')# CBV# CBV路由url(r'^login/',views.MyLogin.as_view())from django.views import Viewclass MyLogin(View):def get(self,request):return render(request,'form.html')def post(self,request):return HttpResponse('post方法')""" FBV和CBV各有千秋 CBV特點能夠直接根據請求方式的不同直接匹配到對應的方法執行內部到底是怎么實現的?CBV內部源碼(******) """ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的django ajax 更新表格_Django(反向解析,路由分发、名称空间、视图层、虚拟环境、Django版本、json,CBV)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arm架构安装rxtx_Parallel
- 下一篇: android ndk怎样加载o文件_在