day20 -Django一对一(多)以及Ajax
上节内容回顾
问题一:Django请求生命周期
-> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
-> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容
问题二:路由系统
/index/ -> 函数或类.as_view()
/detail/(\d+) -> 函数(参数) 或 类.as_view()(参数)
/detail/(?P
/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()
#
#给用户返回时数据
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 #倒序到1forloop.revcounter #倒序到0forloop.last #判断是否是最后一个 返回值 true falseforloop.first #判断是否是第一个 返回值 true falseforloop.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 | 业务线名称 |
---|---|---|---|---|
{{ forloop.counter }} | {{ row.hostname }} | {{ row.ip }} | {{ row.port }} | {{ row.b.caption }} |
主机列表(字典)
主机名 | IP | PORT | 业务线名称 |
---|---|---|---|
{{ row.hostname }} | {{ row.ip }} | {{ row.port }} | {{ row.b__caption }} |
主机列表(元组)
主机名 | IP | PORT | 业务线名称 |
---|---|---|---|
{{ row.1 }} | {{ row.2 }} | {{ row.3 }} | {{ row.5}} |
建议:永远让服务器返回一个字典
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') # 10class 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