如何在Django StackedInline中添加'collapse'

r6vfmomb  于 2022-11-26  发布在  Go
关注(0)|答案(8)|浏览(210)

您可以使用相同的方法添加“类”:['collapse']添加到您的ModelAdmin字段集之一,我希望内联模型管理能够是可折叠的。
这张票,Collapse in admin interface for inline related objects,讨论了我想要完成的事情。但是同时,在我们等待下一个版本的时候,什么是最好的工作?
参考消息:我已经想出了一个解决方案,但我认为还有更好的解决方案。我会让投票来解决。

sg3maiej

sg3maiej1#

你可以使用grapelli--它支持折叠字段集。它使用的解决方案与上面提到的解决方案非常相似,但是javascript / coding已经完成--你只需要添加'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',)
7xzttuei

7xzttuei2#

我使用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");
});
n53p2ov0

n53p2ov03#

在现代的Django中,这就像下面这样简单:

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

7jmck4yq4#

我当前的解决方案基于此处列出的其他解决方案,具有以下功能:

  • 仅折叠堆叠的内联
  • 不折叠包含错误的内联
  • 不折叠“empty”内联。

这是一个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();
});
snvhrwxg

snvhrwxg5#

从Django 1.10开始,我们现在也可以添加额外的css类到InlineModelAdmin中。
包含要应用于为内联呈现的字段集的额外CSS类的列表或元组。默认为“无”。与字段集中配置的类一样,具有折叠类的内联最初将被折叠,其标头将具有一个小的“显示”链接。
文档

x6h2sr28

x6h2sr286#

这是我如何解决它,但它感觉太像一个黑客(黑客)。
我使用Google API托管的jQuery来修改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。

92dk7w1h

92dk7w1h7#

对gerdemb的答案做了一些改进。适当地添加了“Show”和“Hide”文本,并允许您预先在列表中指定表格内联名称:

$(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();
});
});
2ledvvac

2ledvvac8#

如果您想要可折叠内联模型,则:

class AAAAdmin(admin.StackedInline):
    model = AAA
    classes = ['collapse', 'show']

如果希望字段分组可折叠,

fieldsets = (
    ("Basic Details", {'fields': (
        "title", "street_line1", "street_line2", "city", "state", "country", "zipcode",
        "additional_code", "zone", "contact_no"
    )}),
    ("Google Map Related Details", {"classes": ['collapse', 'show'], 'fields': (
        "location", "longitude", "latitude", "google_map_link"
    )}),
)

相关问题