django查漏补缺
Posted ziyide
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django查漏补缺相关的知识,希望对你有一定的参考价值。
前端
html
表单类型(input)
- request.POST.get(‘xxx‘,None)相关的是name和value属性值。
name属性表示提交时候取出来的键值,value属性代表值 - input 类型像checkbox这种多值的,要用values = request.POST.getlist(‘hobby‘,None)
- input类型的checkbox和radio,还有select类型一样显示文字写在外面
- input属性的按钮类型则不同,包括button和submit,其value属性就是显示值。
但是file按钮不同,file类型也算是一个按钮。其只需要一个name属性即可,value属性无用
<input type="file" name="file" > -
input是file类型按钮的话,
表单属性必须是如下
<form action="/upload_handler" enctype="multipart/form-data" method="post">
1. 原生JavaScript中的this对象分三种情况
-在类中,表示实例化本身
-在普通函数中:一般为window对象。但对于事件函数,如果是函数名绑定,例如<a onclick=func> </a>,则是标签本身,否则还是window对象
-直接写在标签的响应事件中,标签本身的对象。 <input value=‘ddd‘ onclick=‘console.log(this);‘>
function Car(color, door) { alert(this) this.showColor = function () { alert(this) }; } // object object (function () { alert(this); })() //windows object
总结:一句话,谁调用这个函数,函数内部的this就是谁
需要注意的是,若原生js函数里面有jquery函数,例如ajax,外层this会被内层this所覆盖。
后端
视图
# obj = request.FILES.get(‘file‘, None) obj是django的特有类型,专门用于处理表单上传文件的uploadfile类型。一般的处理套路如下: f=request.FILES[‘image‘] with open(‘some/file/name.txt‘, ‘wb+‘) as destination: for chunk in f.chunks(): destination.write(chunk) #常用属性就两个: UploadedFile.chunks(chunk_size=None) #返回一个生成器对象,当multiple_chunks()为True时应该使用这个方法来代替read(). UploadedFile.name #上传文件的name。
- 返回值
1. 图片等属性可以指向一个url,并且可以接收图片文件数据并显示(return HttpRespone(f.read()))
2. redirect函数对于ajax提交没用
3. redirect(‘/index‘) 和 redirect(‘index‘)的区别
-前者跳转到127.0.0.1:8000/index
-后者在现有url的网址后面追加index
例如:现访问的是127.0.0.1:8000/backend,追加为:127.0.0.1:8000/backend/index
- CBV模式
例子:CBV视图
注意:django CBV的装饰器,特别不同,要引入一个外壳
from django.utils.decorators import method_decorator class AssetView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(AssetView, self).dispatch(request, *args, **kwargs) @method_decorator(auth.api_auth) def get(self, request, *args, **kwargs): pass
URL
- 在视图中获取url有如下三种方法:
获取带参数URL:request.get_all_path()
获取不带参数URL:request.path
获取主机地址:request.get_host()
- 一类url对应一个视图函数
#普通版 url(r‘^(d+)_(d+)_(d+)$‘, views.test), def test(request, n1, n2, n3): pass #命名正则版: url(r‘^(?P<love1>d+)o(?P<love2>d+)o(?P<love3>d+)$‘, views.test2), def test2(request, love1, love2, love3): pass
- 多个url对应一个视图
利用是‘子类’在前,‘父类’在后,并且使用**kwargs接收
url(r‘^(?P<type>type_[1-3])‘, views.index), url(r‘^$‘, views.index),
- 反向生成url
需要借助url的name参数
url(r‘^home/$‘, views.home, name="homeee"), # html <form action="{% url ‘homeee‘ %}" method="POST"> --------------------------------------------------------------------- #视图中的使用reverse函数得到网址,常用于多个url对应一个视图的情况 from django.core.urlresolvers import reverse if kwargs: base_url = reverse(‘index‘, kwargs=kwargs). #kwargs参数接收 一个字典,代表命名正则的名 和 对应的值。 else: base_url = ‘/‘ --------------------------------------------------------------------- 例如: 反向生成all/1.html # 默认版 url(‘all/(d+).html$‘,home.index,name=‘index‘) {%url "index" 1%} # 在html中 reverse(‘index‘,kwargs=(1,)) # 在view中 # 命名正则版 url(‘all/(?<my_id>d+).html$‘,home.index,name=‘index‘) {%url "index" my_id=1%} # 在html中: reverse(‘index‘,kwargs={"my_id":1}) #在view中
文件
1. django默认的BASE_DIR目录是总项目文件夹下的,所以可以不用拼接绝对路径,
因为django不用绝对路径。
例如: path = os.path.join(‘upload‘, obj.name)
只要保证总目录下有个upload文件夹即可
orm
- 常用‘字段参数’
null # 是否可以为空 default # 默认值 primary_key # 主键 db_column # 列名 db_index # 索引(db_index=True) unique # 唯一索引(unique=True) unique_for_date # 只对日期索引 unique_for_month # 只对月份索引 unique_for_year # 只对年做索引 auto_now # 创建时,自动生成时间 auto_now_add # 更新时,自动更新为当前时间。创建后则不能被修改
- CRUD基本操作详细
# 增 models.User.objects.create(name=‘qianxiaohu‘,age=18) # 第一种 dic = {‘name‘: ‘xx‘, ‘age‘: 19} # 第二种 models.User.objects.create(**dic) # **dic obj = models.User(name=‘xiao‘,age=18) # 第三种 obj.save() # 删 models.User.objects.filter(id=1).delete() # 改 models.User.objects.filter(id__gt=1).update(name=‘alex‘,age=84) dic = {‘name‘: ‘xx‘, ‘age‘: 19} models.User.objects.filter(id__gt=1).update(**dic) #更新优于a=User.objects.get(id=1); k.uname=‘ziyi‘ k.save() # 查 models.User.objects.filter(id=1,name=‘root‘) models.User.objects.filter(id__gt=1,name=‘root‘)# 大于 models.User.objects.filter(id__gte=1) # 大于等于 models.User.objects.filter(id=1,name=‘root‘) dic = {‘name‘: ‘xx‘, ‘age__gt‘: 19} models.User.objects.filter(**dic) # 这里也可以传字典,增删改查都可以加字典
#获取数据集的三种方式 v1 = models.Business.objects.all() #QuerySet类型 ,内部元素都是对象(对象内类似字典结构) v2 = models.Business.objects.all().values(‘id‘,‘caption‘) #QuerySet ,内部元素都是字典 [{‘id‘:1,‘caption‘:‘运维‘},{‘id‘:1,‘caption‘:‘运维‘},{‘id‘:1,‘caption‘:‘运维‘}] v3 = models.Business.objects.all().values_list(‘id‘,‘caption‘) #QuerySet ,内部元素都是元组 [(1,运维),(2,开发)] --------------------------------------------------------------------------------------------- models.Business.objects.get(id=1) 获取到的一个对象,如果不存在就报错 obj = models.Business.objects.filter(id=1).first() 对象或者None
- 查询
1. 其他查询函数(only,exclude)
#only函数,只拿选定的字段 models.Trouble.objects.filter(id=nid).only(‘id‘,‘title‘,‘detail‘) #exclude函数,排除指定条件的部分 Permission2Action.objects.filter().exclude(p__menu_isnull =True)
2. Q查询
注意:filter 的 != 条件应该使用Q查询
- 联合唯一
class Meta: unique_together = (‘field1‘, ‘field2‘,) #对应到 mysql 中的 SQL , 类似如下的语句 CREATE UNIQUE INDEX index_name ON tablename(field1, field2);
- 多表查询连接
多表查询 models.User.objects.all().select_related(‘BookInfo‘)
#select * from User left join BookInfo on User.id = BookInfo.uid
- 注意点
1. 更新表数据有‘时间字段’时,不能借由参数更新
obj = UserGroup.objects.filter(id=1).update(caption=‘CEO‘) # 错误,不支持参数更新。 #正确的做法: obj = UserGroup.objects.filter(id=1).first() # 自动更新时间需要这样写 obj.caption = "CEO" obj.save()
模板
以上是关于django查漏补缺的主要内容,如果未能解决你的问题,请参考以下文章