2

为了在 Django admin 中封装自定义功能,我提供了一个实际上如下所示的自定义ModelAdmin

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

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

4

2 回答 2

6

不确定 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通常不会将其作为 a 传递给此方法,kwarg否则我认为可以在未明确列出args. 希望这对OP或后代有所帮助。

于 2012-10-27T22:04:17.680 回答
1

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

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

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

{% 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变量传递到该过滤器中并使用正则表达式,例如,去除不需要的脚本标记。

于 2011-04-20T03:18:44.307 回答