上节内容回顾

问题一: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的更多相关文章

  1. Python之路,Day20 - 分布式监控系统开发

    Python之路,Day20 - 分布式监控系统开发   本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个 ...

  2. Python之路,Day16 - Django 进阶

    Python之路,Day16 - Django 进阶   本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...

  3. Python之路,Day15 - Django适当进阶篇

    Python之路,Day15 - Django适当进阶篇   本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣 ...

  4. Python自动化运维 - Django(二)Ajax基础 - 自定义分页

    Ajax基础 AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 什么是Ajax AJAX = 异步 Java ...

  5. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  6. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  7. Python之路【第十七篇】:Django之【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  8. Python之路【第十七篇】:Django【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  9. Python之路【第十七篇】Django进阶篇

    规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...

  10. Python之路,Day14 - It's time for Django

    Python之路,Day14 - It's time for Django   本节内容 Django流程介绍 Django url Django view Django models Django ...

随机推荐

  1. 把 excel 和 mysq l数据库相互转换

    不用代码轻松搞定,参考http://jingyan.baidu.com/article/fc07f9891cb56412ffe5199a.html 1.excel 转 mysql a.首先确认你的数据 ...

  2. Centos7下安装mysql5.7.16

    mysql的安装(root用户下) 从官网下载软件 linux下必须安装系统对应的版本,多少位 必须安装的是:server,client 但是我可不管要安装那个插件,我们直接使用bundle版本(就是 ...

  3. C/C++面试知识点总结

    1.中缀,后缀,前缀表达式: 后缀表达式是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法.这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式 ...

  4. Docker和Docker-compose安装教程以及docker-elk,docker-storm安装教程

    此安装教程仅供我自己安装配置时查看,其他的人不可以偷看!!! 安装Docker 1. Update package information, ensure that APT works with th ...

  5. Denormalization

    Denormalization In computing, denormalization is the process of attempting to optimize the read perf ...

  6. ECMAScript 5

    2009年12月,ECMAScript 5.02011年6月,ECMAscript 5.1版发布2015年6月,ECMAScript 6正式通过,成为国际标准ES6第一个版本 ES2015,发布于20 ...

  7. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

  8. 没有了SA密码,无法Windows集成身份登录,DBA怎么办?

    一同事反馈SQL无法正常登录了,以前都是通过windows集成身份验证登录进去的(sa密码早忘记了),今天就改了服务器的机器名,现在无论如何都登录不进去. SQL登录时如果采用windows集成身份验 ...

  9. Jetpack 由 WordPress.com 出品

    官网:https://jetpack.com/ Jetpack 由 WordPress.com 出品. Jetpack 通过为您提供访客统计数据和安全服务.加速图像传输以及帮您获得更多浏览量,可以简化 ...

  10. 解决EditText和ScrollView滑动冲突问题

    该类需要调用 OnTouchListener接口 黄色部分是需要更改部分,改为自己的edittext@Override public boolean onTouch(View view, Motion ...