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))
<!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;
width: 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="">
<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="">
<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="">
<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>
建议:永远让服务器返回一个字典
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')
#
class Application(models.Model):
name = models.CharField(max_length=32)
#
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
Python之路Day20-Django一对一(多)以及Ajax的更多相关文章
- Python之路,Day20 - 分布式监控系统开发
Python之路,Day20 - 分布式监控系统开发 本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个 ...
- Python之路,Day16 - Django 进阶
Python之路,Day16 - Django 进阶 本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...
- Python之路,Day15 - Django适当进阶篇
Python之路,Day15 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣 ...
- Python自动化运维 - Django(二)Ajax基础 - 自定义分页
Ajax基础 AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 什么是Ajax AJAX = 异步 Java ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- Python之路【第十七篇】:Django之【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】Django进阶篇
规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...
- Python之路,Day14 - It's time for Django
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django ...
随机推荐
- CDR VBA鼠标选择
Dim x As Double, y As Double, Shift As Long, b As Boolean, doc As Document Dim sel1 As Shape, sel2 A ...
- Python: open和codecs.open
python的编解码: input文件(gbk, utf-8...) ----decode-----> unicode -------encode------> output文件 ...
- C# Stream
转载:C# 温故而知新:Stream篇(一.二) http://www.cnblogs.com/JimmyZheng/archive/2012/03/17/2402814.html#no2 http: ...
- 【转】理解 PHP 依赖注入 | Laravel IoC容器
Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,减少初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据 ...
- 【Java EE 学习 57】【酒店会员管理系统之分页模板书写】
分页一直是一个比较麻烦的问题,特别是在我做的这个系统中更是有大量的分页,为了应对该问题,特地写了一个模板以方便代码重用,该模板包括后台分页的模板.前端显示的模板两部分. 一.分页分析 分页需要三种类型 ...
- css雪碧图生成工具4.1更新
V4.0介绍地址:http://www.cnblogs.com/wang4517/p/4493917.html 此次更新主要针对已有BUG的修复,用户可在客户端上直接看到更新信息,自己去下载 已修复问 ...
- 基本术语表【WF】
术语 定义 activity(活动) Windows Workflow Foundation 中的程序行为单元. 可将单个活动组合在一起,形成更复杂的活动. activity action(活动操作) ...
- sql 语句
INSERT 基本语法:INSERT INTO table_name VALUES(value1,value2,value3,...); 指定列:INSERT INTO table_name(colu ...
- java中Class.forName("xxx")和ClassLoader().loadClass("xxx")的区别
一.首先,查看Class类中的forName方法,可以发现有如下三个方法,但是我们通常用的是只有一个参数的方法. 简单介绍一下这三个方法: 第一个方法Class.forName("xxx&q ...
- z-stack组网过程
z-stack组网分:协调器建立网络.路由器和终端加入网络 暂时只记录第一次上电建立网络的过程,至于开启NV_RESTORE后,恢复原有的网络则暂时不分析. 一.协调器建立网络: 1.ZDO层的ZDA ...