重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

day20-Django一对一(多)以及Ajax-创新互联

上节内容回顾

问题一:Django请求生命周期

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、鹤山网站维护、网站推广。

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

问题二:路由系统

/index/ -> 函数或类.as_view()
/detail/(\d+)          ->  函数(参数) 或 类.as_view()(参数)
/detail/(?P\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()


#

   #特殊的设置  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}})

    
    
    
        

 {{ obj }} 

     #取单值1234         

 {{ k1.3 }} 

    #取 k1=4 下标为索引0 1 2 3         

 {{ k2.name }} 

 #取字典中 name=张杨         {% for i in k1 %}        #循环取1234             

 {{ i }} 

        {% 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 %}                   

问题五: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的话,使用如下方式。

Ajax请求方式:(返回值无需json转换)

$('#ajax_submit').click(function(){ //获取的是id="ajax_submit"标签,但是属性不能是submit,而且button;
    $.ajax({
        url: "/test_ajax",
        type: 'POST',
        //data: {'hostname': $('#host').val(), 'ip': $('#ip').val(), 'port': $('#port').val(), 'b_id': $('#sel').val()}, //获取的是id标签
        data: $('#add_form').serialize(),  //如果form表单里有多选,需要加一行traditional:true,
        dataType:'JSON',
        //traditional:true,
        success: function(data){    //function里的参数名字无所谓,就是个形参,但是返回的数据不得了,后台返回的值可以在这里执行

            if(data.status){      //相当于 if(data.status == true)
                location.reload();   //重新加载页面
                //location.href="某个地址"; //跳转到某个地址
            }else{
                $('#erro_msg').text(data.error);
            }
        }
    })

$('#ajax_submit').click(function(){
    $.ajax({
        url: "/test_ajax",
        type: 'POST',
        //data: {'hostname': $('#host').val(), 'ip': $('#ip').val(), 'port': $('#port').val(), 'b_id': $('#sel').val()},
        data: $('#add_form').serialize(),  //如果form表单里有多选,需要加一行traditional:true,
        dataType:'JSON',
        //traditional:true,
        success: function(data){    //function里的参数名字无所谓,就是个形参,但是返回的数据不得了,后台返回的值可以在这里执行
            var obj = JSON.parse(data);   //JSON.parse(data)表示将字符串转换成对象;JSON.stringfy(data)是将对象转换成字符串;
            if(obj.status){      //相当于 if(obj.status == true)
                location.reload();   //重新加载页面
                //location.href="某个地址"; //跳转到某个地址
            }else{
                $('#erro_msg').text(obj.error);
            }
        }
    })

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))

全部代码




    
    Title
    



    

主机列表(对象)

    
             
                                           序号                 主机名                 IP                 PORT                 业务线名称                                            {% for row in v1 %}                                              {{ forloop.counter }}                         {{ row.hostname }}                         {{ row.ip }}                         {{ row.port }}                         {{ row.b.caption }}                                  {% endfor %}              

主机列表(字典)

                                           主机名                 IP                 PORT                 业务线名称                                            {% for row in v2 %}                                              {{ row.hostname }}                         {{ row.ip }}                         {{ row.port }}                         {{ row.b__caption }}                                  {% endfor %}              

主机列表(元组)

                                           主机名                 IP                 PORT                 业务线名称                                            {% for row in v3 %}                                              {{ row.1 }}                         {{ row.2 }}                         {{ row.3 }}                         {{ row.5}}                                  {% endfor %}                   
                                            
                              
                                                                    {% for op in b_list %}                    {{ op.caption }}                {% endfor %}                                        提交                                            

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

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

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


当前题目:day20-Django一对一(多)以及Ajax-创新互联
当前网址:http://cqcxhl.cn/article/ddeiji.html