1、render_to_reponse()
不同于render,render_to_response()不用包含request,直接写template中文件
2、locals()
如果views文件中的函数里变量过多的话,可以在render或render_to_response()里面直接增加render(request,'index.html',locals())这样在前端界面渲染的时候可以直接写变量名
locals()的缺点是不想传递过去的变量也传递过去了
3、JS中的方法:
a: hover(f1,f2)
例子:
$(".outer").hover(f1,f2) 其中f1表示鼠标进入时操作,f2表示鼠标退出时操作
hover比mouseover()和mouseout()的优点在于hover一个方法可以表示两个动作
$(".outer").hover(function(){
clearInterval(time);
},function(){
time=setInterval(move,1500)#每一点五秒执行setInterval动作
})
b:关于轮播图乱序问题解决:
$('.num .li').eq(i).stop().fadeIn(1000).siblings().stop().fadeOut(1000);#加入stop表示先将播放全部停止然后在做fadeIn和fadeOut操作
4、template中,如果要简单标注索引可以使用
{{ forloop.counter}} 从1开始
{{ forloop.counter0}} 从0开始
{{forloop.revcounter}} 从最大开始
{{ forloop.revcounter0}}从最大开始到0结束
模板语言中,引用base模板中内容,使用{{ block.super }}
5、ORM操作
增加:
#create方式一:Author.objects.create(name="Alvin")
#create方式二:Author.objects.create(**{"name":"Alvin"}) 推荐使用
如果有外键:
一对多:
<1>models.Book.objects.create(title="python",price=2,publish_id=2) #其中publish为外键关联,默认使用id,所以publish_id自动生成
<2>models.Book.objects.create(title="python",price=2,publish=obj)#publish绑定的是一对多里面一的那个对象,也就是publish对应的 推荐
#obj代表一个object对象
多对多:
1、自动创建
add() remove()
-----------正向绑定
book=models.Book.objects.filter(id=2)[0]
authors=models.Author.objects.filter(id__gt=2)
book.author.add(*authors)
------------反向绑定
authors=models.Author.objects.filter(id=2)[0]
books=models.Book.objects.filter(id__gt=2)
author.book_set.add(*books) #book_set组合在一起组成一个QuerySet ,这个是django自带的功能
#save方式一:author=Author(name="alvin")
author.save()
#save方式二:authorAuthor()
author.name="alvin"
author.save()
2、手动创建
class BOOKAuthor(models.Model):
author=models.ForeignKey('Author')
book=models.ForeignKey('Book')
class Meta:
unique_together=['author','book'] #联合唯一
自己写第三张表
ManytoMany 通过两个ForeignKey完成
OnetoOne 通过一个ForeignKey,uiqueTrue来完成
删除:
models.Book.objects.filter(id=1).delete()
改:
第一种:author=Author.objects.get(id-5)
authort.name='tenglan'
author.save()
第二种:Publisher.objects.filter(id=5).update(name='Ameriacan publshler‘)#不能用get(id=2)来查找锁定
查询API:
filter(**kwargs): 它包含了所有刷选条件匹配的对象
all(): 查询所有结果
get(**kwargs): 返回与所筛选条件匹配对象,返回结果有且只有一个,如果一个都没匹配到会报错
---------------------------------
下面方法都是对查询结果再进行处理,日不objects.filter().values()
vaules(*filed) 返回一个valuequeryset-一个特殊的queryset,运行后得到的并不是一系列model实例对象,而是一个可迭代的字典序列
exclude(**kwargs) 包含了与所给刷选条件不匹配的对象
order_by(*filed) 对查询结果排序,如果按照从大到小排序,可以使用order_by("-id") 这种方式来进行
reverse() 对结果反向排序
distinct() 从返回结果中剔除重复记录
values_list(*filed) 它与values()非常类似,返回的是一个元组序列,values返回的是字典序列
count() 返回数据库中匹配查询QuerySet的对象数量
first() 返回第一条记录
last() 返回最后一条记录
exists() 如果queryset包含数据,返回True,否则返回Flase
惰性机制:
所谓惰性机制,Pbulisher.objects.all()或者.filter()等都只是返回一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。
QuerySet特点:
1、可迭代
2、可切片
#objs=models.Book.objects.all()#(obj1,obj2,obj3,.)
#QuerySet 可迭代
for obj in objs:每一个obj就是一个行对象
print("obj:",obj)
#QuerySet 可切片
#print(objs[1])
#print(objs[1:4])
#print(objs[::-1])
注意,这里因为update返回的是一个整形,所以没法用query属性,对于每次创建一个对象,想显示对应的row sql,需要在settings加上日志记录部分:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } } LOGGING