zoukankan      html  css  js  c++  java
  • Day20-单表中获取表单数据的3种方式

    1. 搭建环境请参考:http://www.cnblogs.com/momo8238/p/7508677.html

    2. 创建表结构

    models.py

    from django.db import models
    # Create your models here.
    
    class Business(models.Model):
        #id列,是自动创建的
        caption=models.CharField(max_length=32)
    
    class Host(models.Model):
        nid=models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True) #加上索引,可以提高查询速度
        ip=models.GenericIPAddressField(protocol="ipv4",db_index=True)
        port=models.IntegerField()
        b=models.ForeignKey("Business",to_field='id')
    

     在Terminal端执行:

    python manage.py makemigrations
    python manage.py migrate
    

     3. 在SQLite中打开.

    4. 在business业务线数据表中,手动增加几条数据

    5. 如果此时想再往 business表中增加一列的话,会报错。因为程序不知道该怎么给已经存在的数据赋这列值。code=models.CharField(max_length=32)

    或者可以在新建的时候写上null=True;  code=models.CharField(max_length=32,null=True)

    或者可以在新建的时候写上default="sa";  code=models.CharField(max_length=32,default="sa")

    选1,增加默认值"sa", 重新打开一下表,就可以看到更新了。

    导入相应的模块,from app01 import models (这里的意思是导入models.py这个模块)

    6.在business表中,测试在单表中获取数据的三种方式。QuerySet就像一个列表,只不过里面存放的是很多对象。

    记忆:只要出现values,那么里面存放的就是字典;

              只要出现values_list,那么里面存放的就是列表;

       除此之外,其它的都是对象。

    下面获取到的都是QuerySet对象。

    v1 = models.Business.objects.all()
    #QuerySet类型,里面存放的是对象。[obj(id,caption,code),obj,obj]

    v2 = models.Business.objects.all().values('id','caption')
    # QuerySet类型,里面存放的是字典[{'id':1,'caption':'运维部'},{'id':1,'caption':'开发部'}..]

    v3 = models.Business.objects.all().values_list('id', 'caption')
    # QuerySet类型,里面存放的是元组[(1,'运维部'),(2,'开发部').....]

    如果想获取一个对象,可以用以下的方法。

    models.Business.objects.get(id=1) #如果不存在的花,则会报错。
    models.Business.objects.filter(id=1) #获取到的是一个对象列表,如果没有匹配的值,返回的列表就为空。但不会报错。
    models.Business.objects.filter(id=1).first() #获取对象列表中的第一个值。

    粘贴部分程序

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^business/', views.business),
    ]
    

    views.py

    from django.shortcuts import render,HttpResponse
    from app01 import models
    # Create your views here.
    
    def business(request):
        v1 = models.Business.objects.all()
        #QuerySet类型,里面存放的是对象。[obj(id,caption,code),obj,obj]
    
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet类型,里面存放的是字典[{'id':1,'caption':'运维部'},{'id':1,'caption':'开发部'}..]
    
        v3 = models.Business.objects.all().values_list('id', 'caption')
        # QuerySet类型,里面存放的是元组[(1,'运维部'),(2,'开发部').....]
    
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    

     business.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)-business</h1>
        {% for row in v1 %}
            <li>{{row.id}} - {{row.caption}} - {{row.code}}</li>
        {% endfor %}
    
        <h1>业务线列表(字典)-business</h1>
        {% for row in v2 %}
            <li>{{row.id}} - {{row.caption}}</li>
        {% endfor %}
    
        <h1>业务线列表(元组)-business</h1>
        {% for row in v3 %}
            <li>{{row.0}} - {{row.1}}</li>
        {% endfor %}
    </body>
    </html>
    

    models.py

    from django.db import models
    # Create your models here.
    
    class Business(models.Model):
        #id列,是自动创建的
        caption=models.CharField(max_length=32)
        code=models.CharField(max_length=32)
    
    class Host(models.Model):
        nid=models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True) #加上索引,可以提高查询速度
        ip=models.GenericIPAddressField(protocol="ipv4",db_index=True)
        port=models.IntegerField()
        b=models.ForeignKey("Business",to_field='id')
    

      

    网页中的效果:

      

     

    7. 手动在app01_host表中增加数据备用

    8. 稍做测试,看下row.b_id,  row_b 分别输出的是什么

    row.b_id:是数字

    row_b:是business object 对象

    row:属于Host object对象

    row.b:属于Business object 对象

    既然row.b属于Business object 对象,那么它后面就可以再通过. 去获取它下面的属性和方法

     插播一句:

    所有的变量都是对象。 对象在python里,其实是一个指针,指向一个数据结构,数据结构里有属性,有方法。

     9. 在前端输出所有信息

    host.html中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机ID</th>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>端口</th>
                    <th>业务线ID</th>
                    <th>业务线名称</th>
                    <th>业务线编码</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v1%}
                <tr>
                    <td>{{row.nid}}</td>
                    <td>{{row.hostname}}</td>
                    <td>{{row.ip}}</td>
                    <td>{{row.port}}</td>
                    <td>{{row.b_id}}</td>
                    <td>{{row.b.caption}}</td>
                    <td>{{row.b.code}}</td>
                </tr>
                {% endfor %}
    
            </tbody>
        </table>
    
    
    </body>
    </html> 

     效果图:

     优化输出,隐藏了主机ID和业务线ID

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)-business</h1>
        <table border="1">
            <thead>
                <tr>
    
                    <th>主机名</th>
                    <th>IP</th>
                    <th>端口</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v1%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{row.hostname}}</td>
                    <td>{{row.ip}}</td>
                    <td>{{row.port}}</td>
                    <td>{{row.b.caption}}</td>
                </tr>
                {% endfor %}
    
            </tbody>
        </table>
    
    
    </body>
    </html> 

    效果图:

     

     10. 一对多表操作,也就是跨表操作。通过.可以实现跨表,通过__也可以实现跨表操作,不过两者的使用场景不同。

    from django.shortcuts import render,HttpResponse
    from app01 import models
    # Create your views here.
    
    def business(request):
        v1 = models.Business.objects.all()
        #QuerySet类型,里面存放的是对象。[obj(id,caption,code),obj,obj]
    
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet类型,里面存放的是字典[{'id':1,'caption':'运维部'},{'id':1,'caption':'开发部'}..]
    
        v3 = models.Business.objects.all().values_list('id', 'caption')
        # QuerySet类型,里面存放的是元组[(1,'运维部'),(2,'开发部').....]
    
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    
    def host(request):
        v1=models.Host.objects.filter(nid__gt=0) #nid>0,其实代表的是所有数据
        # for row in v1:
        #     print(row.b)
        #     print(row.b.caption,row.b.code,sep='	')
        # return HttpResponse("Host")
        v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
        #QuerySet:[{}]
        print(v2)
        return render(request, 'host.html', {'v1': v1})
    

      

     

     10.2

     用字典的方法,让前端获取到数据

     总结3种跨表方式

     views.py

    from django.shortcuts import render,HttpResponse
    from app01 import models
    # Create your views here.
    
    def business(request):
        v1 = models.Business.objects.all()
        #QuerySet类型,里面存放的是对象。[obj(id,caption,code),obj,obj]
    
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet类型,里面存放的是字典[{'id':1,'caption':'运维部'},{'id':1,'caption':'开发部'}..]
    
        v3 = models.Business.objects.all().values_list('id', 'caption')
        # QuerySet类型,里面存放的是元组[(1,'运维部'),(2,'开发部').....]
    
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    
    def host(request):
        v1=models.Host.objects.filter(nid__gt=0) #nid>0,其实代表的是所有数据
        # for row in v1:
        #     print(row.b)
        #     print(row.b.caption,row.b.code,sep='	')
        # return HttpResponse("Host")
        v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
        #QuerySet:[{}]
        for row in v2:
            print(row['nid'],row['hostname'],row['b_id'],row['b__caption'])
    
        v3 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption')
    
    
        return render(request, 'host.html', {'v1': v1,'v2':v2,'v3':v3})
    

    host.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>端口</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v1%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{row.hostname}}</td>
                    <td>{{row.ip}}</td>
                    <td>{{row.port}}</td>
                    <td>{{row.b.caption}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    
        <h1>业务线列表(字典)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v2%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{row.hostname}}</td>
                    <td>{{row.b__caption}}</td>
                </tr>
                {% endfor %}
    
            </tbody>
        </table>
    
        <h1>业务线列表(元组)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v3%}
                <tr hid="{{row.0}}" bid="{{row.2}}">
                    <td>{{row.1}}</td>
                    <td>{{row.3}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </body>
    </html>

    页面效果:

     

    11.一对多表操作的3种方式总结

     

     把host页的名称都改为主机列表

     12. 增加一对多的数据

    为了使输出的数据更好看,我们增加一列命名为序号。在for循环下有个计数器

    <td>{{forloop.counter}}</td>,循环几次,则值就相应地显示为几,可以跟着数据库中的数据进行动态调整。
    <td>{{forloop.counter0}}</td>,从0开始计数(0.1.2.3.)
    <td>{{forloop.revcounter}}</td>,倒着计数计数直到1(3.2.1)
    <td>{{forloop.revcounter0}}</td>,倒着计数计数直到0(3.2.1.0)
    <td>{{forloop.first}}</td>,是否是第一次循环,是的话返回True,否则返回False
    <td>{{forloop.last}}</td>,是否是最后一次循环,是的话返回True,否则返回False
    <td>{{forloop.parentloop}}</td>,当有多层循环的时候,拿到父亲是属于第几次循环。


     host.html中程序修改如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>主机列表(对象)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>端口</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v1%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{forloop.counter}}</td>
                    <td>{{row.hostname}}</td>
                    <td>{{row.ip}}</td>
                    <td>{{row.port}}</td>
                    <td>{{row.b.caption}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    
        <h1>主机列表(字典)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v2%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{row.hostname}}</td>
                    <td>{{row.b__caption}}</td>
                </tr>
                {% endfor %}
    
            </tbody>
        </table>
    
        <h1>主机列表(元组)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v3%}
                <tr hid="{{row.0}}" bid="{{row.2}}">
                    <td>{{row.1}}</td>
                    <td>{{row.3}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </body>
    </html>  

     显示效果:

     

     13. 用模态对话框实现增加一条数据。

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^business/', views.business),
        url(r'^host/', views.host),
    ]
    

    business.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)-business</h1>
        {% for row in v1 %}
            <li>{{row.id}} - {{row.caption}} - {{row.code}}</li>
        {% endfor %}
    
        <h1>业务线列表(字典)-business</h1>
        {% for row in v2 %}
            <li>{{row.id}} - {{row.caption}}</li>
        {% endfor %}
    
        <h1>业务线列表(元组)-business</h1>
        {% for row in v3 %}
            <li>{{row.0}} - {{row.1}}</li>
        {% endfor %}
    </body>
    </html>
    

      

    host.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display:none;
            }
            .shade{
                position:fixed;
                top:0;
                bottom:0;
                right:0;
                left:0;
                background:black;
                opacity:0.6;
                z-index:100;
            }
            .add-modal{
                position:fixed;
                height:300px;
                400px;
                top:100px;
                left:50%;
                z-index:101;
                border:1px solid red;
                background:white;
                margin-left:-200px;
            }
        </style>
    </head>
    <body>
        <h1>主机列表(对象)-business</h1>
        <div>
            <input id="add_host" type="button" value="添加"/>
    
        </div>
        <table border="1">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>端口</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v1%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{forloop.counter}}</td>
                    <td>{{row.hostname}}</td>
                    <td>{{row.ip}}</td>
                    <td>{{row.port}}</td>
                    <td>{{row.b.caption}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    
        <h1>主机列表(字典)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v2%}
                <tr hid="{{row.nid}}" bid="{{row.b_id}}">
                    <td>{{row.hostname}}</td>
                    <td>{{row.b__caption}}</td>
                </tr>
                {% endfor %}
    
            </tbody>
        </table>
    
        <h1>主机列表(元组)-business</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v3%}
                <tr hid="{{row.0}}" bid="{{row.2}}">
                    <td>{{row.1}}</td>
                    <td>{{row.3}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    
        <div class="shade hide"></div>
        <div class="add-modal hide">
            <form method="POST" action="/host/">
                <div class="group">
                    <input type="text" placeholder="主机名" name="hostname"/>
                </div>
    
                <div class="group">
                    <input type="text" placeholder="IP" name="ip"/>
                </div>
    
                <div class="group">
                    <input type="text" placeholder="端口" name="port"/>
                </div>
    
                <div class="group">
                    <select name="b_id">
                        {% for op in b_list %}
                        <option value="{{op.id}}">{{op.caption}}</option>
                        {% endfor %}
    
                    </select>
                </div>
    
                <input type="submit" value="提交"/>
                <input id="cancel" type="button" value="取消"/>
            </form>
        </div>
    
    
        <script src="/static/jquery-1.12.4.js"></script>
        <script>
            $(function(){
                $('#add_host').click(function(){
                    $('.shade,.add-modal').removeClass('hide');
                });
            $('#cancel').click(function(){
                $('.shade,.add-modal').addClass('hide');
                });
            })
        </script>
    
    </body>
    </html>
    

    views.py

    from django.shortcuts import render,HttpResponse,redirect
    from app01 import models
    # Create your views here.
    
    def business(request):
        v1 = models.Business.objects.all()
        #QuerySet类型,里面存放的是对象。[obj(id,caption,code),obj,obj]
    
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet类型,里面存放的是字典[{'id':1,'caption':'运维部'},{'id':1,'caption':'开发部'}..]
    
        v3 = models.Business.objects.all().values_list('id', 'caption')
        # QuerySet类型,里面存放的是元组[(1,'运维部'),(2,'开发部').....]
    
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    
    # def host(request):
    #     v1=models.Host.objects.filter(nid__gt=0) #nid>0,其实代表的是所有数据
    #     # for row in v1:
    #     #     print(row.b)
    #     #     print(row.b.caption,row.b.code,sep='	')
    #     # return HttpResponse("Host")
    #     v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
    #     #QuerySet:[{}]
    #     for row in v2:
    #         print(row['nid'],row['hostname'],row['b_id'],row['b__caption'])
    #
    #     v3 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption')
    #
    #     return render(request, 'host.html', {'v1': v1,'v2':v2,'v3':v3})
    
    
    def host(request):
        if request.method=='GET':
            v1=models.Host.objects.filter(nid__gt=0) #nid>0,其实代表的是所有数据
            v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
            v3 = 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', {'v1': v1,'v2':v2,'v3':v3,'b_list':b_list})
        elif request.method=='POST':
            h=request.POST.get('hostname')
            i = request.POST.get('ip')
            p = request.POST.get('port')
            b = request.POST.get('b_id')
            models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
            return redirect('/host/')
    

    models.py

    from django.db import models
    # Create your models here.
    
    class Business(models.Model):
        #id列,是自动创建的
        caption=models.CharField(max_length=32)
        code=models.CharField(max_length=32)
    
    class Host(models.Model):
        nid=models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True) #加上索引,可以提高查询速度
        ip=models.GenericIPAddressField(protocol="ipv4",db_index=True)
        port=models.IntegerField()
        b=models.ForeignKey("Business",to_field='id')
    

    最终效果

  • 相关阅读:
    Git: fatal: Pathspec is in submodule
    cnpm不是内部或外部命令 cnpm: command not found
    kubectl top查看k8s pod的cpu , memory使用率情况
    Docker 技巧:删除 Docker 所有镜像
    Docker 快速删除所有容器
    使用Dockerfile文件构建基于centOS系统的nodejs镜像
    CentOS下nodejs最简单的安装方法
    yum安装nodejs 8
    系统空间占用排查 tomcat超大日志catalina.out 删除 与df 状态更新
    用dockerfile构建基于centos系统的jar包的镜像
  • 原文地址:https://www.cnblogs.com/momo8238/p/7601989.html
Copyright © 2011-2022 走看看