django-----stark组件中涉及到的知识点

class Book(models.Model):
    title=models.CharField(verbose_name="标题",max_length=32)
    price = models.DecimalField(verbose_name="价格", decimal_places=2, max_digits=5, default=12)
    state = models.IntegerField(choices=((1, "已出版"), (2, "未出版")), default=1)

    publish = models.ForeignKey(to="Publish", default=1)
    authors = models.ManyToManyField(to='author', default=1)
    def __str__(self):
        return self.title

class Publish(models.Model):
    name=models.CharField(max_length=32)
    def __str__(self):
        return self.name


class author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()

    def __str__(self):
        return self.name 
models.py中的model模型

在django中的models模型中model有一个属性,_meta,里面封装了关于model的一些方法.

model._meta.model_name  #获取到的是这个类的类名
model._meta.app_label    #获取到的是这个model所在的app的名字
字段对象= model._meta.get_field("字段名")    #字段名是字符串类型的字段名,获取到的是该字符串类型的字段名对应的字段对象
字段对象.verbose_name  
(verbose_name是取出该字段的名字,如果在model.py中这个字段中设置的有verbose_name(这个属性是对字段的描述信息)就会使用设置的值,如果没有设置,默认取出的是该字段的字段名)

django中的Q方法

from django.db.models import  Q

方式一:
#filter中的条件两者之间是and的关系,Q中的字段名是model中的字段,不能是字符串类型的.(如果中间是用,和&隔开的就是and的关系,如果是|就是或的关系,如果是~就是非的关系)
models.objects.filter(Q(字段名="值1"),Q(字段名="值2"))    

方式二:
qd=Q()    #实例化出来一个Q对象qd

qd.connector="or"    #标明条件之间是什么关系

qd.children.append(("字段名","值1"))   #字段名是models中的字符串类型的字段名, 
qd.children.append(("字段名","值2"))

方式一就等价于方式二,但不同之处是方式一中的字段名不能是字符串类型的,是model中的字段名,方式二中的必须是字符串类型的字段名

 跳转页面时保留搜索条件

QueryDict类型,(从request.GET中取出来的是一个QueryDict类型的字典,该类型的字典默认是不能做修改的,除非加上 request.GET._mutable=True)

from django.http import QueryDict

print(request.GET)    #<QueryDict:{"id":"1"}>
request.GET._mutable=True    #加上这一句话就可以对QueryDict对象进行修改了
request.GET['a']=1    #<QueryDict:{"id":"1","a":"1"}>


#urlencode编码  #可以将QueryDict字典转换成为"id=1&a=1"的形式
request.GET.urlencode()    #转换成了"id=1&a=1"
'''

如果url中有条件的话,就需要把条件进行一下优化,避免先输入的条件和后来又加上的条件有条件重复的,不知道哪个是哪个,需要再添加一个键值对,把request.GET的在深度拷贝之后做为值封装在这个键值对中,做为值
params=request.GET #这里使用的request是show_list_view中的request,
import copy
params=copy.deepcopy(params)
params._mutable=True #有了该设置,QueryDict才可以像字典一样做修改,params.urlencode()将QueryDict类型的字典转换编码格式,转换成为"id=1&a=1"
from django.http import QueryDict   #引入QueryDict类
qd=QueryDict(mutable=True) #设置mutable为True,就可以像字典那样做操作了
qd["list_filter"]=params.urlencode() #给实例对象qd添加一个键值对,用来保留条件信息,避免条件信息中的刚开始就携带的条件和后来又加上的条件有重复的,以至于不知道哪个是哪个 qd:{"list_filter":"page=2&id=4"}
qd.urlencode()会把字典转换成为 键=条件&条件,但是编码的原因会把上面qd中的=和&转换掉,当然这是编码的问题,list_filter=page%3D2%26id%3D4

如果url?list_filter=page%3D2%26id%3D4是这种形式的,在跳转到回原来的页面时也应该保留条件,使用
request.GET.get("list_filter")就可以直接取到解码之后的"id=1&a=1"

''' #创建QueryDict qd=QueryDict(mutable=True) #默认参数将mutable设置为True就可以对QueryDict的实例化对象进行类似字典的一系列操作 qd["name"]="yuan"

 在请求中,如果是GET请求"  url?id=1&title=python

  request.GET.  QueryDict:{get请求中url中携带的信息,这是一个个的键值对}

  request.POST  是一个空字典{}  原因是get请求的时候没有请求体,

如果是POST请求:url?id=1&title=python

  request.GET  QueryDict{"id":"1","title":"python"}

  request.POST  取出的是一个有键值对的字典,这个字典中存放的是请求体中的数据

 

python中一切皆对象,所以定义一个函数,那么函数名也是一个对象

def foo():
    print("1111")

foo.desc="我是foo函数"    #添加一个属性,作用是对这个函数的描述信息
print(foo.desc)        #我是foo函数

django中 model实例出来的对象,可以通过对象.model取出当前类的类名,也就是表名

<!--vertical-align 是在行级标签时移动比较小 -->
<select class="form-control" name="action" id="" style="width: 200px;margin: 8px 2px;display: inline-block;vertical-align: -1px">

 

一个HTML的js中
function foo(res){...}

绑定事件js
function pop(url) {
window.open(url,"","width=500,height=400,top=200,left=500")
}

另外一个HTML页面的js中 ,接收到响应数据后就关闭当前页,并把响应数据给调用它的foo函数
opener.foo('{{ res|safe }}');
window.close();


 

opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用。


当使用window.open()打开一个窗口,您可以使用此属性返回来自目标窗口源(父)窗口的详细信息。


代码提示: window.opener.close()将关闭源(父)窗口。

 

 

 

  

 

posted @ 2018-03-15 16:56  dwenwen  阅读(50)  评论(0)    收藏  举报