要在Django管理员中封装自定义功能,我提供了一个实际上如下的自定义ModelAdmin class:
class ArticleAdmin(admin.ModelAdmin):
class Media:
js = ("my_code.js",)
我注意到my_code.js
会在添加和更改页面中加载,但我只需要在添加页面中加载它。是否可以这样做(以及如何)?
感谢。
答案 0 :(得分:5)
不确定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。有兴趣的读者可能需要调整args
和kwargs
以匹配方法规范。 context
通常不会kwarg
传递给此方法,否则我认为可以在未明确列出args
的情况下对其进行编辑。希望这对OP或后代有所帮助。
答案 1 :(得分:1)
不幸的是,要包含的JavaScript文件列表是由管理应用程序的视图函数提供的media
上下文变量生成和分配的,您无法轻易覆盖它。但这是一个不那么优雅的解决方案:
在当前模型的admin添加页面上查看源代码,并复制从第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
变量传递到并使用正则表达式,例如,去除不需要的脚本标记。