python一对一参数_Python之路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的话,使用如下方式。

deftest_ajax(request):importjson

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']='太短了'

exceptException as e:

ret['status']=False

ret['error']='请求错误'

#print(json.dumps(ret))

return HttpResponse(json.dumps(ret))

View Code

Title

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: 1px solid red;

background-color: white;

margin-left: -200px;

z-index: 101;

}

主机列表(对象)

序号主机名IPPORT业务线名称

{% for row in v1 %}{{ forloop.counter }}{{ row.hostname }}{{ row.ip }}{{ row.port }}{{ row.b.caption }}{% endfor %}

主机列表(字典)

主机名IPPORT业务线名称

{% for row in v2 %}{{ row.hostname }}{{ row.ip }}{{ row.port }}{{ row.b__caption }}{% endfor %}

主机列表(元组)

主机名IPPORT业务线名称

{% for row in v3 %}{{ row.1 }}{{ row.2 }}{{ row.3 }}{{ row.5}}{% endfor %}

{% for op in b_list %}{{ op.caption }}{% endfor %}

提交

$('#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);

}

}

})

})

})

View Code

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

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')#10

classApplication(models.Model):

name= models.CharField(max_length=32)#2

classHostToApp(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值