Дифференцировать медиаданные ModelAdmin для добавления / изменения страниц в Django - PullRequest
1 голос
/ 20 апреля 2011

Для инкапсуляции пользовательских функций в админке Django я предоставляю пользовательский класс ModelAdmin , который на самом деле выглядит так:

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

Я заметил, что my_code.js загружается как на страницах добавления, так и на страницах изменений, но мне нужно загружать его только на странице добавления. Можно ли это сделать (и как)?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 октября 2012

Не уверен, что 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.Надеюсь, что это полезно для ОП или потомков.

1 голос
/ 20 апреля 2011

К сожалению, список включаемых файлов JavaScript создается и присваивается контекстной переменной media, предоставляемой из функции просмотра приложения администратора, которую вы не можете легко переопределить.Но вот одно не очень элегантное решение:

Просмотрите исходный код на странице добавления администратора для вашей текущей модели и скопируйте теги сценария, которые импортируют файлы JavaScript, начиная со строки 14 (я использую 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 ви используйте регулярное выражение, например, чтобы удалить нежелательный тег сценария.

...