【问题标题】:Differentiate ModelAdmin media for add/change pages in Django在 Django 中区分用于添加/更改页面的 ModelAdmin 媒体
【发布时间】:2011-08-09 02:33:56
【问题描述】:

为了在 Django admin 中封装自定义功能,我提供了一个自定义的 ModelAdmin class,实际上看起来像这样:

class ArticleAdmin(admin.ModelAdmin):
    class Media:
        js = ("my_code.js",)

我注意到my_code.js 在添加页面和更改页面中都被加载,但我只需要在添加页面中加载它。是否可以这样做(以及如何)?

【问题讨论】:

  • 我认为(但可能是错误的)这是不可能通过class Media 实现的。如果您覆盖特定的管理模板,您可以实现此行为。

标签: django django-admin media modeladmin


【解决方案1】:

不确定 StackOverflow 如何喜欢挖掘旧帖子,但我发现这是针对我自己的问题进行研究,并找到了一个比公认答案更优雅的解决方案。您可以覆盖render_change_form 方法来更新context['media'] 定义。此问题的示例:

def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
    if add:
        if context.has_key('media'):
            old_media = context['media']
        else:
            old_media = forms.Media()
        context.update({'media': old_media+forms.Media(js=("js/SPD_media_admin.js",)) })
    return super(ArticleAdmin,self).render_change_form(request=request, context=context, add=add, change=change, form_url=form_url, obj=obj)

这适用于 Django 1.4。有兴趣的读者可能需要调整argskwargs 以匹配方法规范。 context 通常不会作为kwarg 传递给此方法,否则我认为它可以在未明确列出args 的情况下进行编辑。希望这对OP或后代有所帮助。

【讨论】:

    【解决方案2】:

    不幸的是,要包含的 JavaScript 文件列表是由管理应用程序的视图函数提供的 media 上下文变量生成和分配的,您无法轻松覆盖该变量。但这里有一个不太优雅的解决方案:

    在管理添加页面上查看您当前模型的源代码并复制从第 14 行开始导入 JavaScript 文件的脚本标签(我使用的是 Django 1.2)。您将在下面的代码片段中看到将它们粘贴到何处。

    在您的templates/admin/my_app/article 目录中创建您自己的自定义change_form.html 模板,并将以下内容放入文件中:

    {% extends "admin/change_form.html" %}
    {% block extrahead %}
    {% url admin:jsi18n as jsi18nurl %}
    <script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script>
    {% if add %}
    {{ media }}
    {% else %}
    <!-- originally generated script tags: may differ depending on your model's fields -->
    <script type="text/javascript" src="/media/admin/js/core.js"></script>
    <script type="text/javascript" src="/media/admin/js/admin/RelatedObjectLookups.js"></script>
    <script type="text/javascript" src="/media/admin/js/jquery.min.js"></script>
    <script type="text/javascript" src="/media/admin/js/jquery.init.js"></script>
    <script type="text/javascript" src="/media/admin/js/actions.min.js"></script>
    <!-- end originally generated script tags -->
    {% endif %}
    {% endblock %}
    

    请注意,例如,如果您将日期字段添加到模型中,则当您编辑记录时,该字段将无法在更改表单上正常工作,因为不会调用所需的 calendar.js 文件。如果您进行了此类更改,则必须手动添加它。

    更进一步并恢复失去的动态性的另一种方法是创建一个模板过滤器,您可以将media 变量传递到并使用正则表达式,例如,去除不需要的脚本标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 2018-03-05
      • 2016-03-18
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多