zoukankan      html  css  js  c++  java
  • Python之路Day20-Django一对一(多)以及Ajax

    上节内容回顾

    问题一:Django请求生命周期

    -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
    -> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容

    问题二:路由系统

    /index/ -> 函数或类.as_view()
    /detail/(d+) -> 函数(参数) 或 类.as_view()(参数)
    /detail/(?P<nid>d+) -> 函数(参数) 或 类.as_view()(参数)
    /detail/ -> include("app01.urls")
    /detail/ name='a1' -> include("app01.urls")
        - 视图中:reverse
        - 模板中:{% url "a1" %}

    问题三:视图函数

    #FBV函数:

        def index(request,*args,**kwargs):

          ...

    #CBV函数:

      class Home(views.View):

        def get(self,reqeust,*args,**kwargs):

    ##获取用户请求的数据:

      request.POST.get
      request.GET.get
      reqeust.FILES.get()

    #checkbox

      request.POST.getlist() 
      request.GET.getlist()
      reqeust.FILES.getlist()

          request_path_info   

      文件对象 = reqeust.FILES.get()
      文件对象.name
      文件对象.size
      文件对象.chunks()


    # <form 特殊的设置></form>    #特殊的设置  enctype="multipart/form-data"

    #给用户返回时数据

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

    问题四:模板语言

    render(request, "模板的文件的路径", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': '张杨','age': 21}})

        <html>
        
        <body>
            <h1> {{ obj }} </h1>     #取单值1234
            <h1> {{ k1.3 }} </h1>    #取 k1=4 下标为索引0 1 2 3
            <h1> {{ k2.name }} </h1> #取字典中 name=张杨
    {% for i in k1 %} #循环取1234 <p> {{ i }} </p> {% endfor %} {% for row in k2.keys %} #循环字典取1 2 3 4 {{ row }} {% endfor %} {% for row in k2.values %} #循环取字典对应的value值 张杨 21 {{ row }} {% endfor %} {% for k,v in k2.items %} #循环字典取 key - values {{ k }} - {{v}} {% endfor %} </body> </html>

    问题五:ORMO(bject Relation Mapping)--对象关系映射

    a. 创建类和字段
      class User(models.Model):
        age = models.IntergerFiled()
        name = models.CharField(max_length=10)          -->max_length=10 #字符长度
          执行如下命令
      python manage.py makemigrations
      python manage.py migrate

          注意:
      # settings.py 注册APP

    b.操作

    增加:

    #方法一

         models.User.objects.create(name='ZhangYang',age=21)  

    #方法二

         dic = {'name': 'ZhangYang', 'age': 21}

         models.User.objects.create(**dic)

    #方法三

      obj = models.User(name='ZhangYnag',age=21)
      obj.save()

    删除:

           models.User.objects.filter(id=1).delete()

    修改:

    #方法一

           models.User.objects.filter(id__gt=1).update(name='ZhangYang',age=21) #找到id大于1 将name改为‘ZhangYang’ age改为'21'

    #方法二

      dic = {'name': 'YoungCheung', 'age': 18}
      models.User.objects.filter(id__gt=1).update(**dic)   #找到id大于1 将name改为‘YoungCheung’ age改为'18'

    查询:

      models.User.objects.filter(id=1,name='root')
      models.User.objects.filter(id__gt=1,name='root')
      models.User.objects.filter(id__lt=1)
      models.User.objects.filter(id__gte=1)
      models.User.objects.filter(id__lte=1)

          #范例 找到id=1,name=root将name改为YoungCheung,age改为19

          models.User.objects.filter(id=1,name='root')

      dic = {'name': 'YoungCheung', 'age__gt': 19}

      models.User.objects.filter(**dic)

      v1 = models.Business.objects.all()
      # QuerySet ,内部元素都是对象

      # QuerySet ,内部元素都是字典
      v2 = models.Business.objects.all().values('id','caption')
      # QuerySet ,内部元素都是元组
      v3 = models.Business.objects.all().values_list('id','caption')

      # 获取到的一个对象,如果不存在就报错
      models.Business.objects.get(id=1) #获取到一个对象 如果不存在直接报错,那么通过如下解决
      None或者 对象= models.Business.objects.filter(id=1).first()

          #外键  

      v = models.Host.objects.filter(nid__gt=0)
      v[0].b.caption ----> 通过.进行跨表

    外键:
      class UserType(models.Model):
        caption = models.CharField(max_length=32)
        id caption
        # 1, VIP用户
        # 2,普通用户
        # 3, 游客

          class User(models.Model):
        age = models.IntergerFiled()
        name = models.CharField(max_length=10)   #字符长度
        # user_type_id = models.IntergerFiled()        # 约束,
        user_type = models.ForeignKey(to="UserType",to_field='id') # 约束,

          例如

      name      age user_type_id
      # 张杨1    18         1
      # 张杨2    18         2
      # 张杨3    18         3

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

     给表格前面加上序号

    forloop.counter    #每循环一次记录一次
    forloop.counter0   #从0开始每循环一次记录一次
    forloop.revcounter #倒序到1
    forloop.revcounter #倒序到0
    forloop.last     #判断是否是最后一个 返回值 true  false
    forloop.first    #判断是否是第一个  返回值 true  false

    forloop.parentloop #如果包含嵌套的循环那么 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下,如下面图片所示

     一、Ajax

      对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

    def test_ajax(request):
        import json
        ret={'status':True,'error':None,'data':None}
        try:
            h=request.POST.get('hostname')
            i=request.POST.get('ip')
            p=request.POST.get('port')
            b=request.POST.get('b_id')
            if h and len(h)>5:
                models.Host.objects.create(hostname=h,
                                           ip=i,
                                           port=p,
                                           b_id=b
                                           )
            else:
                ret['status']=False
                ret['error']='太短了'
        except Exception as e:
            ret['status']=False
            ret['error']='请求错误'
        #print(json.dumps(ret))
        return HttpResponse(json.dumps(ret))
    View Code 
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
            .shade{
                position: fixed;
                top:0;
                right: 0;
                left: 0;
                bottom: 0;
                background-color: black;
                opacity: 0.6;
                z-index: 100;
            }
            .add-modal{
                position: fixed;
                height: 300px;
                 400px;
                top: 100px;
                left: 50%;
                border: 1px solid red;
                background-color: white;
                margin-left: -200px;
                z-index: 101;
            }
        </style>
    </head>
    <body>
    
        <h2>主机列表(对象)</h2>
        <div>
            <input id="add_host"  type="button" value="添加" />
        </div>
        <table border="1">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>PORT</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>
    <h2>主机列表(字典)</h2>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>PORT</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v2 %}
                        <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>
    <h2>主机列表(元组)</h2>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>IP</th>
                    <th>PORT</th>
                    <th>业务线名称</th>
                </tr>
            </thead>
            <tbody>
                {% for row in v3 %}
                        <tr hid="{{ row.0 }}" bid="{{ row.4 }}">
                            <td>{{ row.1 }}</td>
                            <td>{{ row.2 }}</td>
                            <td>{{ row.3 }}</td>
                            <td>{{ row.5}}</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" id="host" placeholder="HOSTNAME" name="hostname"/>
            </div>
    
            <div class="group">
                <input type="text" id="ip" placeholder="IP" name="ip"/>
            </div>
            <div class="group">
                <input type="text"  id="port" placeholder="PORT" name="port"/>
            </div>
            <div class="group">
                <select id='sel' name="b_id">
                   {% for op in b_list %}
                       <option value="{{ op.id }}">{{ op.caption }}</option>
                   {% endfor %}
                </select>
            </div>
            <input type="submit" value="提交">
            <a id="ajax_submit" style="display: inline-block;padding: 4px;background-color: green">提交</a>
            <input id="cancel" type="button" value="取消">
             <span id="error_msg" style="color: red"></span>
            </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');
                });
    
                $('#ajax_submit').click(function(){
                    $.ajax({
                        url:"/test_ajax",
                        type:"POST",
                        data:{'hostname':$('#host').val(),'ip':$('#ip').val(),'port':$('#port').val(),'b_id':$('#sel').val()},
                        success:function(data){
                            var obj = JSON.parse(data);
                            if(obj.status){
                                location.reload();
                            }else{
                                $('#erro_msg').text(obj.error);
                            }
                        }
                    })
                })
            })
    
    
        </script>
    </body>
    </html>
    View Code

    建议:永远让服务器返回一个字典

    return HttpResponse(json.dumps(字典))

    更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

     二、多对多操作

    自定义关系表

    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(to="Business", to_field='id')
                # 10
    class Application(models.Model):
        name = models.CharField(max_length=32)
                # 2          
    class HostToApp(models.Model):
        hobj = models.ForeignKey(to='Host',to_field='nid')
        aobj = models.ForeignKey(to='Application',to_field='id')
        # HostToApp.objects.create(hobj_id=1,aobj_id=2)

     自动创建关系表

    class Business(models.Model):
        caption = models.CharField(max_length=32)
        code = models.CharField(max_length=32,null=True,default="SA")
    
    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(to="Business", to_field='id')
    
    class Application(models.Model):
        name=models.CharField(max_length=32)
        r=models.ManyToManyField('Host')

     # 第三张表操作

    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.r.clear()

    obj.r.set([3,5,7])

    # 所有相关的主机对象“列表” QuerySet
    obj.r.all()

    1

  • 相关阅读:
    sb#run():
    aop编程,自定义注解参数和方法范围
    vue 工程化
    mybatis SqlSession
    java传时间
    树的同构
    串的模式匹配
    堆栈模拟队列
    银行业务队列简单模拟
    一元多项式的乘法与加法运算
  • 原文地址:https://www.cnblogs.com/youngcheung/p/6201013.html
Copyright © 2011-2022 走看看