【问题标题】:How to add custom javascript to django-xadmin?如何将自定义 javascript 添加到 django-xadmin?
【发布时间】:2016-06-16 19:19:45
【问题描述】:

对于 Django 的 stock (out of the box) 管理员,添加自定义 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 都没有加载。 p>

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

打印出来:

#### 媒体是 {'_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 的任何想法?或者在覆盖时如何保留它?

【问题讨论】:

  • 它(xadmin)看起来像一个死项目......
  • 它确实有很多未解决的问题和 PR,但所有者仍然存在并且实际上时不时地提交一些更改。

标签: python django django-templates django-admin


【解决方案1】:

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

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

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

【讨论】:

  • 该死,尝试了类似的东西,但我想我忘了import xadmin。刚刚更新了我的代码并进行了测试 - 您的解决方案非常有效,非常感谢!
  • 一个小改动:它是def get_media(self):media 参数不存在,否则你会得到 "TypeError: get_media() 只需要 2 个参数(给定 1 个)".
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多