python【第二十篇】Django表的多对多、Ajax

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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)

PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式。

17130
来自专栏FreeBuf

Windows下SLmail邮件服务器缓冲区溢出理解及实验

本次缓冲区溢出实验是在Windows7 Unlimit 64位下的SLmail邮件服务溢出测试。 注:SLmail并不是一个特别常用的邮件服务应用,本次实验仅限...

42150
来自专栏java思维导图

开源项目renren-fast解读,让java不再难懂(二)

1、百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览...

30040
来自专栏JackeyGao的博客

Celery用户手册 - Tasks

Tasks是Celery 应用的构建块。事实上Celery应用是由一个或多个Task拼装组成的。

23230
来自专栏SDNLAB

基于OpenDaylight和OVSDB搭建VxLAN网络

1 简介 本文主要介绍基于OpenDaylight子项目OVSDB中的southbound组件来搭建VxLAN网络,包括初始环境搭建和southbound Re...

35870
来自专栏小李刀刀的专栏

[译]Laravel 5.0 之方法注入

本文译自 Matt Stauffer 的系列文章. ---- Laravel 5.0 中, 容器可以对其解析的方法进行自动分析, 然后根据类型限制把方法所需要的...

35560
来自专栏点滴积累

Jupyter(Python)中无法使用Cache原理分析

前言 最近需要在Jupyter中写一个类库,其中有一个文件实现从数据库中读取空间数据并加载为Feature对象,Feature对象是cartopy封装的geom...

35660
来自专栏菩提树下的杨过

[biztalk笔记]-1.Hello World!

开始接触biztalk了,这个东西感觉不象linq,silverlight等具体的技术好学,看了几天文档,也跑通了一些小示例,但是仍然觉得毫无感觉,只大概的知道...

23160
来自专栏有趣的django

33.Django ModelForm

ModelForm  1.ModeForm简单验证 from django.db import models # Create your models her...

31040
来自专栏机器学习从入门到成神

Hibernate之saveOrUpdate

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

25720

扫码关注云+社区

领取腾讯云代金券