如何将自定义 javascript 添加到 django-xadmin?
How to add custom javascript to django-xadmin?
对于 Django 的 stock(开箱即用) admin,添加自定义 JavaScript 就像 simple/easy 一样:
class ContentAdmin(admin.ModelAdmin):
model = Content
class Media:
js = ('js/content.js',)
在 Django 1.8.4 中运行良好(已测试)。
现在我在我的项目中使用 django-xadmin 增强用户 interface/experience。问题是上面的代码没有将自定义 JS 添加到 xadmin 的视图中。
查看了项目的自述文件,"documentation"(或没有)甚至深入研究了源代码。我得到的最远的是弄清楚覆盖 get_media()
方法它实际上将自定义 JS 添加到视图中,但由于它 覆盖 父调用所有其他 xadmin 的 JS 和 CSS 未加载。
class ContentAdmin(admin.ModelAdmin):
model = Content
class Media:
js = ('js/content.js',)
def get_media(self):
# Tried "super(ContentAdmin, self).get_media()"
## » Says method doesn't exists
# Tried "super(ContentAdmin, self).media"
## » Exactly the same thing as "self.media" below
media = self.media
print("#### MEDIA IS {}".format(media.__dict__))
return media
打印出:
#### MEDIA IS {'_css': {}, '_js': ['/static/admin/js/core.js', '/static/admin/js/admin/RelatedObjectLookups.js', '/static/admin/js/jquery.js', '/static/admin/js/jquery.init.js', '/static/admin/js/actions.js', 'js/content.js']}
我的自定义 JS ('js/content.js'
) 确实存在并已加载,但所有其他默认 xadmin 的 CSS 和 JS 都消失了。
关于如何在不覆盖父媒体属性的情况下添加自定义 JS 有什么想法吗?或者如何在覆盖时保留它?
您似乎没有正确使用 django-xadmin 的管理界面。
使用 django-xadmin,您的管理对象不应继承自 django 的 admin.ModelAdmin
,而应继承自 object
。当您在应用程序的 adminx.py
模块中执行 xadmin.site.register(model,admin_class)
时,django-xadmin 会根据插件和 url 模式动态生成(并缓存)实际的 class。
您的 adminx.py
应该类似于:
import xadmin
from .models import Content
class ContentAdmin(object):
def get_media(self):
# media is the parent's return value (modified by any plugins)
media = super(ContentAdmin,self).get_media()
media.add_js(('js/content.js',))
return media
xadmin.site.regsiter(Content,ContentAdmin)
对于 Django 的 stock(开箱即用) admin,添加自定义 JavaScript 就像 simple/easy 一样:
class ContentAdmin(admin.ModelAdmin):
model = Content
class Media:
js = ('js/content.js',)
在 Django 1.8.4 中运行良好(已测试)。
现在我在我的项目中使用 django-xadmin 增强用户 interface/experience。问题是上面的代码没有将自定义 JS 添加到 xadmin 的视图中。
查看了项目的自述文件,"documentation"(或没有)甚至深入研究了源代码。我得到的最远的是弄清楚覆盖 get_media()
方法它实际上将自定义 JS 添加到视图中,但由于它 覆盖 父调用所有其他 xadmin 的 JS 和 CSS 未加载。
class ContentAdmin(admin.ModelAdmin):
model = Content
class Media:
js = ('js/content.js',)
def get_media(self):
# Tried "super(ContentAdmin, self).get_media()"
## » Says method doesn't exists
# Tried "super(ContentAdmin, self).media"
## » Exactly the same thing as "self.media" below
media = self.media
print("#### MEDIA IS {}".format(media.__dict__))
return media
打印出:
#### MEDIA IS {'_css': {}, '_js': ['/static/admin/js/core.js', '/static/admin/js/admin/RelatedObjectLookups.js', '/static/admin/js/jquery.js', '/static/admin/js/jquery.init.js', '/static/admin/js/actions.js', 'js/content.js']}
我的自定义 JS ('js/content.js'
) 确实存在并已加载,但所有其他默认 xadmin 的 CSS 和 JS 都消失了。
关于如何在不覆盖父媒体属性的情况下添加自定义 JS 有什么想法吗?或者如何在覆盖时保留它?
您似乎没有正确使用 django-xadmin 的管理界面。
使用 django-xadmin,您的管理对象不应继承自 django 的 admin.ModelAdmin
,而应继承自 object
。当您在应用程序的 adminx.py
模块中执行 xadmin.site.register(model,admin_class)
时,django-xadmin 会根据插件和 url 模式动态生成(并缓存)实际的 class。
您的 adminx.py
应该类似于:
import xadmin
from .models import Content
class ContentAdmin(object):
def get_media(self):
# media is the parent's return value (modified by any plugins)
media = super(ContentAdmin,self).get_media()
media.add_js(('js/content.js',))
return media
xadmin.site.regsiter(Content,ContentAdmin)