Как добавить 'коллапс' к Django StackedInline

Таким же образом можно добавить 'классы': ['коллапс'] к одному из Вашего ModelAdmin fieldsets, я хотел бы иметь возможность иметь Встроенного Образцового Администратора быть разборным.

Этот билет, Коллапс в администраторском интерфейсе для встроенных связанных объектов, обсуждает точно, что я хочу выполнить. Но тем временем, какова лучшая работа вокруг, в то время как мы ожидаем следующего выпуска?

К вашему сведению: я предложил решение, но я думаю, что лучший существует. Я позволю голосованию заботиться о нем.

17
задан Daniel Rhoden 8 January 2010 в 04:54
поделиться

3 ответа

Вот как я решил эту проблему, но это слишком похоже на взлом (для взлома).

Я использовал jQuery, размещенный в Google API, чтобы изменить DOM, воспользовавшись собственным скриптом 'show/hide' от Django. Если вы посмотрите на html-источник страницы администратора, то последний загруженный скрипт выглядит так:

<script type="text/javascript" src="/media/admin/js/admin/CollapsedFieldsets.js"></script>

Комментарии в этом файле дали мне идею: Использовать ModelAdmin media definitions для загрузки моего собственного скрипта изменения домена.

from django.contrib import admin
from django.contrib.admin.sites import AdminSite
from myapp.models import *
import settings
media = settings.MEDIA_URL

class MyParticularModelAdmin(admin.ModelAdmin):
    # .....
    class Media:
          js = ('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js',
              media+'js/addCollapseToAllStackedInlines.js')
# .....

А затем внутри файла javascript, на который есть ссылка:

// addCollapseToAllStackedInlines.js
$(document).ready(function() {
  $("div.inline-group").wrapInner("<fieldset class=\"module aligned collapse\"></fieldset>");
});

Конечный результат работает только на StackedInline, а не на TabularInline.

2
ответ дан 30 November 2019 в 14:00
поделиться

Я придумал это решение, используя jQuery, который работает на TabularInline

var selector = "h2:contains('TITLE_OF_INLINE_BLOCK')";
$(selector).parent().addClass("collapsed");
$(selector).append(" (<a class=\"collapse-toggle\" id=\"customcollapser\" href=\"#\"> Show </a>)");
$("#customcollapser").click(function() {
    $(selector).parent().toggleClass("collapsed");
});
4
ответ дан 30 November 2019 в 14:00
поделиться

Несколько улучшений в ответе gerdemb. Добавляет текст «Показать» и «Скрыть» соответствующим образом и позволяет заранее указать табличные встроенные имена в списке:

$(document).ready(function(){
var tabNames = ['Inline Name 1', 'Inline Name 2', 'Inline Name 3'];
for (var x in tabNames)
{
    var selector = "h2:contains(" + tabNames[x] + ")";
    $(selector).parent().addClass("collapsed");
    $(selector).append(" (<a class=\"collapse-toggle\" id=\"customcollapser\""+ x + " href=\"#\"> Show </a>)");
};    
$(".collapse-toggle").click(function(e) {
    $(this).parent().parent().toggleClass("collapsed");
    var text = $(this).html();
    if (text==' Show ') {
        $(this).html(' Hide ');
        }
    else {
        $(this).html(' Show ');
    };
    e.preventDefault();
});
});
2
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: