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对象。
先引用一个官网的例子:
?
下面讲解,它实例化的顺序
首先看Widget类的定义:
?
然后看元类MediaDefiningClass的定义:
?
它首先会判断Widget类有没有media属性, 没有就通过media_property()方法添加。
接着来探究media_property()方法是如何添加media属性的:
?
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对象。
相关文章推荐
- dajngo.forms.widget-Media
- django signal 拾遗
- Proof for Floyd-Warshall's Shortest Path Derivation Algorithm Also Demonstrates the Hierarchical Path Construction Process
- django.relatedField-关联域
- django.contrib.auth.backend-后台
- google-io-2014
- django.contirb.auth-认证
- google guava
- 1057 - Collecting Gold (状态压缩DP)
- Golang学习笔记 - 【杂项】格式化时间成datetime
- Light OJ 1051 - Good or Bad
- 不疯魔,不成活,Rackspace为什么对管理云如此狂热
- kali——google安装
- django在admin页面展示表的记录的值
- golang 调试
- Golang的安装
- LightOJ - 1057 Collecting Gold(状压DP)
- LightOJ - 1051 Good or Bad(扫描)
- 好用的类别Category
- django下video播放时间不能超过5s并且视频有时无法显示问题的解决方法