您的位置:首页 > 编程语言 > Go语言

django.forms-Widget和Media间的联系

2015-10-29 10:53 483 查看
Media的作用是引用js和css的, 用来修饰Widget的。它们之间通过Widget定义media属性或内置Media类来联系的。

先引用一个官网的例子:

?
这是通过内置Media类来实现js和css引用的。

下面讲解,它实例化的顺序

首先看Widget类的定义:

?
with_metaclass()方法返回一个通过元类动态生成的类。

然后看元类MediaDefiningClass的定义:

?
通过复写__new__方法,来动态添加media属性。

它首先会判断Widget类有没有media属性, 没有就通过media_property()方法添加。

接着来探究media_property()方法是如何添加media属性的:

?
因为涉及到继承的原因, 所以会有些复杂。media的继承是通过制定extend属性。

media默认会自动继承父类, 也可以设置extend = False取消继承。当然也可以指定extend = ( 'js' )或着( 'css' , 'js' ),

选择性的继承某部分。

首先它会获取父类的media,否则返回空的media。然后根据extend的值,来添加继承的部分。

然后结合内置Media类的属性,返回最后的media。

最后返回经过property()包装的_media函数。

property()是经常用来包装对属性的访问。可以看出,我们通过Widget.media访问media属性,获取到的是动态生成的。

这也意味着,每次返回的结果都是同一个media。可以通过id( )函数测试。

以上都是通过内置Media类来达到对js和css的引用。还有种方法是直接定义media。

仍旧引用官网的例子:

?
这样同样可以达到相同的效果, 但是不能继承。

还有个优点是,我们可以制定返回的是新的media对象, 也可以是同一个media对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: