1 創建多對多表的方式有兩種
1.1 方式一:自定義關系表
1 class Host(models.Model): 2 nid = models.AutoField(primary_key=True) 3 hostname = models.CharField(max_length=32,db_index=True) 4 ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) 5 port = models.IntegerField() 6 b = models.ForeignKey(to="Business", to_field='id') 7 8 class Application(models.Model): 9 name = models.CharField(max_length=32) 10 11 12 class HostToApp(models.Model): 13 hobj = models.ForeignKey(to='Host',to_field='nid') 14 aobj = models.ForeignKey(to='Application',to_field='id')
那么我們可以通過對第三張表的操作HostToApp,增刪改查各種多對多的關系:
models.HostToApp.objects.create(hobj_id=1,aobj_id=2)
1.2 方式二:自動創建第三張表
1 class Host(models.Model): 2 nid = models.AutoField(primary_key=True) 3 hostname = models.CharField(max_length=32,db_index=True) 4 ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) 5 port = models.IntegerField() 6 b = models.ForeignKey(to="Business", to_field='id') 7 8 class Application(models.Model): 9 name = models.CharField(max_length=32) 10 r = models.ManyToManyField("Host")
這種方式無法直接操作第三張表,但是可以通過10行r這個對象,進行間接操作第三張表:
obj = models.Application.objects.get(id=1) obj.name # 第三張表操作 # 添加 obj.r.add(1) obj.r.add(2) obj.r.add(2,3,4) obj.r.add(*[1,2,3,4]) # 刪除 obj.r.remove(1) obj.r.remove(2,4) obj.r.remove(*[1,2,3]) # 清除obj所對應的所有主機 obj.r.clear() # 設置,可以理解為刪除原來的,設置成下面的 obj.r.set([3,5,7]) # 所有相關的主機對象“列表” QuerySet obj.r.all()
2 Ajax
為某個標簽寫個AJAX請求:
JS代碼:
1 $('#app-edit5').click(function () { 2 $.ajax({ 3 url: "/cmdb/app_edit_ajax/", //提交給哪個url 4 type: "POST", //請求方式 5 data: $('#app-edit-form').serialize(), //請求數據可以以字典的形式,此處是獲取這個form表單中的所有 6 traditional: true, // 提交數據中有數組 7 dataType: "JSON", // 寫了這個不用反序列化data,data就直接是對象 8 success:function (data) { 9 if(data.status){ 10 location.reload(); //刷新頁面 11 }else { 12 $('#app_edit_error').text(data.error); 13 } 14 } 15 }) 16 });
后端代碼:
1 def app_edit_ajax(request): 2 if request.method == "POST": 3 ret = {'status': True, 'error': None, 'data': None} 4 aid = request.POST.get("nid") 5 app_name = request.POST.get("app-name") 6 h_list = request.POST.getlist("app-hosts") 7 try: 8 if app_name: 9 obj = models.Application.objects.filter(id=aid).first() 10 obj.name = app_name 11 obj.save() 12 obj.r.set(h_list) 13 else: 14 ret['status'] = False 15 ret['error'] = "應用名稱不能為空" 16 except Exception as e: 17 print("錯誤信息:", e) 18 ret['status'] = False 19 ret['error'] = '請求錯誤' 20 21 return HttpResponse(json.dumps(ret))
3 Django總結
3.1 完整的Django的請求周期:
1 請求 -> 路由系統 -> 試圖函數(獲取模板+數據=》渲染) -> 字符串返回給用戶
3.2 路由系統書寫的幾種方式
1 /index/ -> 函數或類.as_view() 2 /detail/(\d+) -> 函數(參數) 或 類.as_view()(參數) 3 /detail/(?P<nid>\d+) -> 函數(參數) 或 類.as_view()(參數) 4 5 /detail/ -> include("app01.urls") 6 /detail/ name='a1' -> include("app01.urls") 7 - 視圖中:reverse 8 - 模板中:{% url "a1" %}
3.3 視圖函數
FBV:
from django.views import View class Home(View): def dispatch(self, request, *args, **kwargs): print("before") result = super(Home, self).dispatch(request, *args, **kwargs) print("after") return result def get(self, request): print(request.method) return render(request, "home.html") def post(self, request): print(request.method, "post") return render(request, "home.html")
CBV:
def host(request): if request.method == "GET": h_dic = models.Host.objects.all() h_dic1 = models.Host.objects.filter(nid__gt=0).values('nid', 'hostname', 'b_id', 'b__caption') h_dic2 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption') b_list = models.Business.objects.all() return render(request, "host.html", {'h_dic': h_dic, 'h_dic1': h_dic1, 'h_dic2': h_dic2, 'b_list': b_list}) elif request.method == "POST": h = request.POST.get("hostname", None) i = request.POST.get("ip", None) p = request.POST.get("port", None) b = request.POST.get("b_id", None) models.Host.objects.create(hostname=h, ip=i, port=p, b_id=b) return redirect('/host/')
獲取用戶請求中的數據:
1 request.POST.get 2 request.GET.get 3 reqeust.FILES.get() #獲取文件 4 5 # checkbox, 6 ........getlist() #獲取列表 7 8 request.path_info # 獲取路徑 9 10 11 文件對象 = reqeust.FILES.get() 12 文件對象.name 13 文件對象.size 14 文件對象.chunks() 15 #依賴這個設置 <form enctype="multipart/form-data"></form>
給用戶返回數據:
render(request, "模板的文件的路徑", {'k1': [1,2,3,4],"k2": {'name': 'zingp','age': 73}}) redirect("URL") HttpResponse(字符串)
3.4 模板語言
# 視圖函數中: render(request, "模板的文件的路徑", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': 'zingp','age': 73}}) #html <html> <body> <h1> {{ obj }} </h1> <h1> {{ k1.3 }} </h1> <h1> {{ k2.name }} </h1> {% for i in k1 %} <p> {{ i }} </p> {% endfor %} {% for row in k2.keys %} {{ row }} {% endfor %} {% for row in k2.values %} {{ row }} {% endfor %} {% for k,v in k2.items %} {{ k }} - {{v}} {% endfor %} </body> </html>