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. class HostToApp(models.Model):
  12. hobj = models.ForeignKey(to='Host',to_field='nid')
  13. aobj = models.ForeignKey(to='Application',to_field='id')

那么我们可以通过对第三张表的操作HostToApp,增删改查各种多对多的关系:

  1. 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这个对象,进行间接操作第三张表:

  1. obj = models.Application.objects.get(id=1)
  2. obj.name
  3.  
  4. # 第三张表操作
  5. # 添加
  6. obj.r.add(1)
  7. obj.r.add(2)
  8. obj.r.add(2,3,4)
  9. obj.r.add(*[1,2,3,4])
  10.  
  11. # 删除
  12. obj.r.remove(1)
  13. obj.r.remove(2,4)
  14. obj.r.remove(*[1,2,3])
  15.  
  16. # 清除obj所对应的所有主机
  17. obj.r.clear()
  18.  
  19. # 设置,可以理解为删除原来的,设置成下面的
  20. obj.r.set([3,5,7])
  21.  
  22. # 所有相关的主机对象“列表” QuerySet
  23. 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

  1. from django.views import View
  2. class Home(View):
  3. def dispatch(self, request, *args, **kwargs):
  4. print("before")
  5. result = super(Home, self).dispatch(request, *args, **kwargs)
  6. print("after")
  7. return result
  8.  
  9. def get(self, request):
  10. print(request.method)
  11. return render(request, "home.html")
  12.  
  13. def post(self, request):
  14. print(request.method, "post")
  15. return render(request, "home.html")

CBV:

  1. def host(request):
  2. if request.method == "GET":
  3. h_dic = models.Host.objects.all()
  4. h_dic1 = models.Host.objects.filter(nid__gt=0).values('nid', 'hostname', 'b_id', 'b__caption')
  5. h_dic2 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption')
  6.  
  7. b_list = models.Business.objects.all()
  8.  
  9. return render(request, "host.html", {'h_dic': h_dic, 'h_dic1': h_dic1, 'h_dic2': h_dic2, 'b_list': b_list})
  10.  
  11. elif request.method == "POST":
  12. h = request.POST.get("hostname", None)
  13. i = request.POST.get("ip", None)
  14. p = request.POST.get("port", None)
  15. b = request.POST.get("b_id", None)
  16.  
  17. models.Host.objects.create(hostname=h,
  18. ip=i,
  19. port=p,
  20. b_id=b)
  21.  
  22. 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. 文件对象 = reqeust.FILES.get()
  11. 文件对象.name
  12. 文件对象.size
  13. 文件对象.chunks()
  14. #依赖这个设置 <form enctype="multipart/form-data"></form>

给用户返回数据:

  1. render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': 'zingp','age': 73}})
  2. redirect("URL")
  3. HttpResponse(字符串)

3.4 模板语言

  1. # 视图函数中:
  2. render(request, "模板的文件的路径", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': 'zingp','age': 73}})
  3.  
  4. #html
  5. <html>
  6.  
  7. <body>
  8. <h1> {{ obj }} </h1>
  9. <h1> {{ k1.3 }} </h1>
  10. <h1> {{ k2.name }} </h1>
  11. {% for i in k1 %}
  12. <p> {{ i }} </p>
  13. {% endfor %}
  14.  
  15. {% for row in k2.keys %}
  16. {{ row }}
  17. {% endfor %}
  18.  
  19. {% for row in k2.values %}
  20. {{ row }}
  21. {% endfor %}
  22.  
  23. {% for k,v in k2.items %}
  24. {{ k }} - {{v}}
  25. {% endfor %}
  26.  
  27. </body>
  28. </html>

python【第二十篇】Django表的多对多、Ajax的更多相关文章

  1. Python开发【第二十篇】:缓存

    Python开发[第二十篇]:缓存redis&Memcache   点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...

  2. Python之路【第二十篇】:待更新中.....

    Python之路[第二十篇]:待更新中.....

  3. Python第二十六天 python装饰器

    Python第二十六天 python装饰器 装饰器Python 2.4 开始提供了装饰器( decorator ),装饰器作为修改函数的一种便捷方式,为工程师编写程序提供了便利性和灵活性装饰器本质上就 ...

  4. Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...

  5. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...

  6. python第二十九课——文件读写(读取读取中文字符)

    演示:读取中文字符 结论: 1).如果不设置encoding,默认使用gbk进行编解码 2).如果编码和解码不一致,最终导致报错,但是一旦设置了errors='ingore',那么就不会报错,而采取乱 ...

  7. 孤荷凌寒自学python第二十九天python的datetime.time模块

     孤荷凌寒自学python第二十九天python的datetime.time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.time模块是专门用来表示纯时间部分的类. ...

  8. 孤荷凌寒自学python第二十六天python的time模块的相关方法

    孤荷凌寒自学python第二十六天python的time模块的相关方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 要使用time模块的相关方法,必须在文件顶端引用: import tim ...

  9. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

  10. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

随机推荐

  1. Numeral.js 是一个用于格式化和数字四则运算的js 库

    1.Numeral.js 是一个用于格式化和数字四则运算的js 库. 2.支持多种语言,包含中文在内的17种语言. 在浏览器中引用js文件: <script src="numeral. ...

  2. MFC框架中消失的WinMain()

    学过一段时间的MFC之后,很多人大概都有一个疑问:在MFC中,WinMain()哪去了?因为任何一个使用过Win32 SDK编程的人都知道,WinMain()函数是Win32程序开始的入口点,可是在M ...

  3. java21 封装Response:

    封装Response: /** * 封装响应信息 */ public class Response { //两个常量 public static final String CRLF="\r\ ...

  4. 【转】针对iOS VS. Android开发游戏的优劣——2013-08-25 17

    http://game.dapps.net/gamedev/experience/8670.html 问题:如果你正在一个新工作室开发一款新的平板/手机游戏,你会选择iOS还是Android? 回答: ...

  5. PHP【第一篇】安装

    一.准备 1.环境 系统平台:Red Hat Enterprise Linux Server release 7.3 (Maipo) 内核版本:3.10.0-514.el7.x86_64 2.下载安装 ...

  6. SAXParser 解析器和 XMLEventReader(读取XML文档)

    import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import java ...

  7. Swift之语法1(精简版)

    1. Swift简介 2010年的夏天,苹果公司的开发人员Chris Lattne接到了一个特别的任务,为OS X 和iOS平台开发下一代的编程语言,也就是Swift. 苹果公司于2014年WWDC( ...

  8. Java Inner class

    2016-03-27 内部类:就是把一个类的定义放在另外一个外围类定义的里面. class OutterClass{ class InnerClass { } } 1. 内部类主要有四种:成员内部类( ...

  9. 百度编辑器umeditor使用总结

    百度编辑器是一个功能很全.很强大. 百度单张图片上传只能存储在项目下面,而不能独立自定义存储位置,因此重写上传代码 百度文章中的图片是通过base64实现的,直接存储在数据库中 tomcat通过虚拟路 ...

  10. tcl/tk实例详解——返回一个文件夹下所有文件的绝对路径

    http://blog.csdn.net/dulixin/article/details/2133840 #所有代码如下,使用注释的方式讲解脚本#修改好文件夹和保存结果路径,可以把本文件直接拷贝进tc ...