Как добавить 'развал' в Django StackedInline - PullRequest
17 голосов
/ 08 января 2010

Таким же образом вы можете добавить 'classes': ['collapse'] к одному из ваших наборов полей ModelAdmin, я бы хотел, чтобы встроенный админ модели был разборным.

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

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

Ответы [ 7 ]

4 голосов
/ 02 июня 2012

Вы можете использовать grappelli - который поддерживает сворачивающиеся наборы полей. Он использует решение, очень похожее на решение, упомянутое выше, но javascript / кодирование уже сделано - вам просто нужно добавить 'classes' :( collapse closed ',), к вашему набору полей (см. http://readthedocs.org/docs/django-grappelli/en/latest/customization.html)

например:

class ModelOptions(admin.ModelAdmin):
    fieldsets = (
        ('', {
            'fields': ('title', 'subtitle', 'slug', 'pub_date', 'status',),
        }),
        ('Flags', {
            'classes': ('grp-collapse grp-closed',),
            'fields' : ('flag_front', 'flag_sticky', 'flag_allow_comments', 'flag_comments_closed',),
        }),
        ('Tags', {
            'classes': ('grp-collapse grp-open',),
            'fields' : ('tags',),
        }),
    )

class StackedItemInline(admin.StackedInline):
    classes = ('grp-collapse grp-open',)

class TabularItemInline(admin.TabularInline):
    classes = ('grp-collapse grp-open',)
4 голосов
/ 01 июля 2010

Я придумал это решение, используя 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");
});
3 голосов
/ 23 сентября 2016

Начиная с django 1.10, теперь мы можем добавлять дополнительные классы CSS в InlineModelAdmin.

Список или кортеж, содержащий дополнительные классы CSS для применения к набору полей, который отображается для встроенных элементов. По умолчанию Нет. Как и в случае классов, настроенных в наборах полей, строки с классом свертывания будут изначально свернуты, а их заголовок будет иметь небольшую ссылку «показать».

Docs

2 голосов
/ 28 августа 2012

Мое текущее решение, основанное на других перечисленных здесь, имеет следующие функции:

  • Свертывает только сложенные строки
  • Не сворачивает строки, содержащие ошибку
  • Не сворачивает пустую строку.

Это решение Javascript, которое означает, что его нужно каким-то образом вставить в вашу страницу / шаблон.

Требуется, чтобы jQuery был загружен на страницу ко времени его выполнения. Современные версии Django имеют это.

$(function(){
  // Find all stacked inlines (they have an h3, with a span.inline_label).
  // Add a link to toggle collapsed state.
  $('.inline-group h3 .inline_label').append(' (<a class="collapse-toggle" href="#">Show</a>)');
  // Collapse all fieldsets that are in a stacked inline (not .tabular)
  $('.inline-group :not(.tabular) fieldset').addClass('collapsed');
  // Click handler: toggle the related fieldset, and the content of our link.
  $('.inline-group h3 .inline_label .collapse-toggle').on('click', function(evt) {
    $(this).closest('.inline-related').find('fieldset').toggleClass('collapsed');
    text = $(this).html();
    if (text=='Show') {
      $(this).html('Hide');
    } else {
      $(this).html('Show');
    };
    evt.preventDefault();
    evt.stopPropagation();
  });
  // Un-collapse empty forms, otherwise it's 2 clicks to create a new one.
  $('.empty-form .collapse-toggle').click();
  // Un-collapse any objects with errors.
  $('.inline-group .errors').closest('.inline-related').find('.collapse-toggle').click();
});
2 голосов
/ 30 июля 2010

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

$(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 голосов
/ 08 января 2010

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

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

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

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

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.

0 голосов
/ 07 января 2019

В современном Django это так же просто, как следующее:

class FooInline(admin.StackedInline):
     model = Foo
     classes = ['collapse']
...