如何将自定义javascript添加到django-xadmin?

时间:2016-03-03 12:48:49

标签: python django django-templates django-admin

对于Django的股票(开箱即用) admin,添加自定义JavaScript非常简单:

class ContentAdmin(admin.ModelAdmin):
    model = Content

    class Media:
        js = ('js/content.js',)

在Django 1.8.4(已测试过)中精彩地工作。

现在我在项目中使用django-xadmin来增强用户界面/体验。问题是上面的代码没有将自定义JS添加到xadmin的视图中。

执行项目的自述文件,“文档”(或缺少),甚至深入研究源代码。我得到的最远的是找出覆盖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的任何想法?或者在重写时如何保留它?

1 个答案:

答案 0 :(得分:4)

您似乎没有正确使用django-xadmin的管理界面。

使用django-xadmin,您的管理对象不应该继承自django' admin.ModelAdmin,而只是object。当您在应用的xadmin.site.register(model,admin_class)模块中执行adminx.py时,django-xadmin会根据插件和网址格式动态生成(并缓存)实际的类。

您的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)