ajax相關操作
1 inclusion_tag
-幹什麽用的?生成html的片段(動態,傳參數,傳數據)
-app下新建一個模塊,templatetags
-創建一個py文件(mytag.py)
-from django.template import Library
-register=Library() ----->register名字一定不能變
-寫裝飾器(標簽,過濾器,inclusion_tag)
-@inclusion_tag(‘模板路徑‘,name=‘重命名‘)
-def my_in(): 不寫,寫多個,不寫不傳,寫多個,按空格來傳參
- 一堆邏輯處理,查數據庫
- ret=Book.object.all()
return {‘‘books‘:ret}
-在模板中:
可以用books這個變量,渲染頁面
-應用: -在另一個模板中:
-{%load mytag.py%}
-{% my_in %}
2 defer,only
-defer---->除了指定字段之外
-only---->只查詢幾個字段
-比如:ret=Book.object.all().only(‘name‘)
-id始終會查
-結果是queryset對象,套book對象
-問:如果取price,發生了什麽?
-它會再次查詢數據庫,對數據庫造成壓力
3 事務(原子性操作)
from django.db import transition
with transition.atomic():
sql1
sql2
4 choice
-模型表中某個字段,可以指定choice,用在選擇不經常變的情況,經常變,盡量用數據庫 user_type=models.ForeignKey(to=‘Info‘, to_field=‘id‘,db_constraint=False)
#取出對應的漢字
# author對象.user_type.name
mychoice=((1,‘男‘),(2,‘女‘),(3,‘其他‘))
# dd = models.ForeignKey(to=‘Info‘, to_field=‘id‘)
#取出對應的漢字
dd = models.ForeignKey(choices=mychoice)
5反向解析
-動態獲取路徑(根據名字) -路由: url(r‘^inde/$‘, views.Test.as_view(),name=‘index‘), url(r‘^inde/(\d+)$‘, views.Test.as_view(),name=‘index‘), -在視圖層: def mytest(request): # 用在視圖層 url=reverse(‘index‘,args=(12,)) return redirect(url) -在模板中用: <a href="/index/">點我跳到index頁面</a> <a href="{% url ‘index‘ 12 %}">點我跳到index頁面</a> {#這個位置相當於放了"/inde/"#}
6 多對多的關系,三種寫法
-手動創建第三張表(不創建關聯關系) class Book(models.Model): # 默認會創建id name = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) class Book2Author(models.Model): id = models.AutoField(primary_key=True) book=models.ForeignKey(to=‘Book‘,to_field=‘id‘) author=models.ForeignKey(to=‘Author‘,to_field=‘id‘) -不管是插入和查詢,刪除,都很麻煩(一般不用) -自動創建第三張表 -查詢,插入,刪除,都很方便 -缺點:字段是固定的,第三張表如果要添加字段,實現不了 -手動創建第三張表,建立關聯關系 class Book(models.Model): # 默認會創建id name = models.CharField(max_length=32) # 中介模型,手動指定第三張中間表是Book2Author authors=models.ManyToManyField(to=‘Author‘,through=‘Book2Author‘,through_fields=(‘book‘,‘author‘)) class Author(models.Model): name = models.CharField(max_length=32) def __str__(self): return self.name class Book2Author(models.Model): id = models.AutoField(primary_key=True) book=models.ForeignKey(to=‘Book‘,to_field=‘id‘) author=models.ForeignKey(to=‘Author‘,to_field=‘id‘) -through:來指定我的第三張表是哪個 -through_fields:(‘book‘,‘author‘),第一個值是:從中間表找到設置關聯字段的表,通過哪個字段,第一個位置就寫它 -終極總結:防止混了:關聯字段就是表名小寫,第一個值:就是當前表的表名小寫 -查詢,新增,刪除,都很方便 -第三張表,可以添加別的字段
7、ajax
1 什麽是ajax:異步的JavaScript和xml,跟後臺交互,都用json 2 ajax幹啥用的?前後端做數據交互: 3 之前學的跟後臺做交互的方式: -第一種:在瀏覽器窗口輸入地址(get) -第二種:用form表單提交數據 4 特點: -異步(異步和同步的區別:同步是請求發過去,要等著回應;異步:不需要等回應,可以進行其他操作) -局部刷新: 5 $.ajax({ url:‘/index/‘, type:‘post‘, //data:往後臺提交的數據 data:{‘name‘:‘lqz‘,‘age‘:18}, //成功的時候回調這個函數 success:function (data) { alert(data) } }) 6 上傳文件 模板層: $("#btn").click(function () { //上傳文件,必須用FormData,生產一個formdata對象 var formdata=new FormData(); formdata.append(‘name‘,$("#name").val()); //取出文件$("#myfile")[0].files拿到的是文件列表,取第0個把具體的文件取出來 formdata.append(‘myfile‘,$("#myfile")[0].files[0]); $.ajax({ url:‘/files_ajax/‘, type:‘post‘, //不預處理數據,(name=lqz&age=18) processData:false, //指定往後臺傳數據的編碼格式(urlencoded,formdata,json) //現在用formdata對象處理了,就不需要指定編碼格式了,不要給我編碼了 contentType:false, data:formdata, success:function (data) { alert(data) } }) 視圖層:(跟form表單上傳文件完全一樣) def files_ajax(request): # 提交文件從,request.FILES中取,提交的數據,從request.POST中取 name=request.POST.get(‘name‘) print(name) dic_files = request.FILES myfile = dic_files.get(‘myfile‘) with open(myfile.name, ‘wb‘) as f: # 循環上傳過來的文件 for line in myfile: # 往空文件中寫 f.write(line) return HttpResponse(‘ok‘) 7 基於ajax提交json格式數據 -模板層: $(‘#btn‘).click(function () { var post_data={‘name‘:$("#name").val(),‘pwd‘:$("#pwd").val()}; console.log(typeof post_data); // 如何把post_data這個字典,轉成json格式字符串 //JSON.stringify相當於python中json.dumpus(post_data) //pos是個字符串,json格式字符串 var pos=JSON.stringify(post_data); console.log(typeof pos); $.ajax({ url:‘/json/‘, type:‘post‘, data:pos, contentType:‘application/json‘, success:function (data) { //如果data是json格式字符串,如何轉成對象(字典)? //data=JSON.parse(data) console.log(typeof data) console.log(data) var ret=JSON.parse(data) console.log(typeof ret) console.log(ret.status) //alert(data) } }) }) -視圖層: def add_json(request): if request.method==‘GET‘: return render(request,‘json.html‘) print(request.POST) print(request.GET) print(request.body) import json # res是個字典 res=json.loads(request.body.decode(‘utf-8‘)) print(res) print(type(res)) dic={‘status‘:‘100‘,‘msg‘:‘登錄成功‘} # return HttpResponse(‘ok‘) # 返回給前臺json格式 return HttpResponse(json.dumps(dic)) # return JsonResponse(dic) -重點:***** - 請求的編碼方式: contentType:‘application/json‘, -響應回來解析的方式 dataType:‘json‘,
ajax相關操作