最终,我想包含/排除基于...的某些 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
包裹(通过 MediaDefiningClass
)并且因为我重写了媒体,我的媒体属性(property)没有被包装。我尝试通过以下方式手动包装它:
from django.forms import media_property
MyModelAdmin.media = media_property(MyModelAdmin)
但是 media_property 导入失败。
如何让它包含静态媒体和动态媒体,以及如何以 django 满意的方式添加动态媒体?
最佳答案
在写完上述问题后不久,我发现了一种可行的方法。我没有定义 Media
类,而是通过 media
方法手动添加我的所有 css/js:
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
model = MyModel
...
@property
def media(self):
media = super(MyModelAdmin, self).media
css = {
"all": (
"my/css/file1.css",
"my/css/file2.css",
)
}
js = [
"my/js/file1.js",
"my/js/file2.js",
]
if whatever_condition_I_want:
js.append("my/js/file3.js")
media.add_css(css)
media.add_js(js)
return media
关于javascript - 如何覆盖 Django 的 ModelAdmin 的 "media"属性并使其动态化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302175/