最终,我想基于...包含/排除某些 javascript 文件。简单地定义 Media 类本身是行不通的,因为它只被评估一次。
我知道我可以通过制作自定义管理模板来做到这一点,但我想知道是否有一种简单的方法可以通过使媒体属性动态化来做到这一点。
这是我到目前为止所拥有的:
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
model = MyModel
...
@property
def media(self):
media = super(MyModelAdmin, self).media
if whatever_condition_I_want:
# somehow add "my/js/file3.js"
return media
class Media:
css = {
"all": (
"my/css/file1.css",
"my/css/file2.css",
)
}
js = (
"my/js/file1.js",
"my/js/file2.js",
)
这几乎可行,但我发现调用super(MyModelAdmin, self).media
忽略了我当前班级的媒体定义。在四处寻找时,我发现这是因为父类的媒体属性由django.forms.widgets.media_property
(via MediaDefiningClass
) 包装,并且由于我正在覆盖媒体,所以我的媒体属性没有被包装。我尝试通过以下方式手动包装它:
from django.forms import media_property
MyModelAdmin.media = media_property(MyModelAdmin)
但 media_property 无法导入。
我怎样才能让它包含我的静态媒体和我的动态媒体,以及如何以 django 满意的方式添加我的动态媒体?