上节内容回顾

问题一: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><h2>{{obj}}</h2>#取单值1234<h2>{{k1.3}}</h2>#取k1=4下标为索引0123<h2>{{k2.name}}</h2>#取字典中name=张杨{%foriink1%}#循环取1234<p>{{i}}</p>{%endfor%}{%forrowink2.keys%}#循环字典取1234{{row}}{%endfor%}{%forrowink2.values%}#循环取字典对应的value值张杨21{{row}}{%endfor%}{%fork,vink2.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#倒序到1forloop.revcounter#倒序到0forloop.last   #判断是否是最后一个返回值truefalseforloop.first    #判断是否是第一个返回值truefalseforloop.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里的参数名字无所谓,就是个形参,但是返回的数据不得了,后台返回的值可以在这里执行varobj=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);}}})


deftest_ajax(request):importjsonret={'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')ifhandlen(h)>5:models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)else:ret['status']=Falseret['error']='太短了'exceptExceptionase:ret['status']=Falseret['error']='请求错误'#print(json.dumps(ret))returnHttpResponse(json.dumps(ret))


全部代码

<!DOCTYPEhtml><htmllang="en"><head><metacharset="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;width:400px;top:100px;left:50%;border:1pxsolidred;background-color:white;margin-left:-200px;z-index:101;}</style></head><body><h3>主机列表(对象)</h3><div><inputid="add_host"type="button"value="添加"/></div><tableborder="1"><thead><tr><th>序号</th><th>主机名</th><th>IP</th><th>PORT</th><th>业务线名称</th></tr></thead><tbody>{%forrowinv1%}<trhid="{{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><h3>主机列表(字典)</h3><tableborder="1"><thead><tr><th>主机名</th><th>IP</th><th>PORT</th><th>业务线名称</th></tr></thead><tbody>{%forrowinv2%}<trhid="{{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><h3>主机列表(元组)</h3><tableborder="1"><thead><tr><th>主机名</th><th>IP</th><th>PORT</th><th>业务线名称</th></tr></thead><tbody>{%forrowinv3%}<trhid="{{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><divclass="shadehide"></div><divclass="add-modalhide"><formmethod="POST"action="/host"><divclass="group"><inputtype="text"id="host"placeholder="HOSTNAME"name="hostname"/></div><divclass="group"><inputtype="text"id="ip"placeholder="IP"name="ip"/></div><divclass="group"><inputtype="text"id="port"placeholder="PORT"name="port"/></div><divclass="group"><selectid='sel'name="b_id">{%foropinb_list%}<optionvalue="{{op.id}}">{{op.caption}}</option>{%endfor%}</select></div><inputtype="submit"value="提交"><aid="ajax_submit"style="display:inline-block;padding:4px;background-color:green">提交</a><inputid="cancel"type="button"value="取消"><spanid="error_msg"style="color:red"></span></form></div><scriptsrc="/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){varobj=JSON.parse(data);if(obj.status){location.reload();}else{$('#erro_msg').text(obj.error);}}})})})</script></body></html>

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

return HttpResponse(json.dumps(字典))

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

二、多对多操作

自定义关系表

classHost(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')#10classApplication(models.Model):name=models.CharField(max_length=32)#2classHostToApp(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)


自动创建关系表

classBusiness(models.Model):caption=models.CharField(max_length=32)code=models.CharField(max_length=32,null=True,default="SA")classHost(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')classApplication(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