Django Admin -添加fieldset的折叠,但一开始是展开的

cyej8jka  于 2022-12-14  发布在  Go
关注(0)|答案(9)|浏览(159)

有没有一种方法可以使一个fieldset可折叠,但开始时是展开的?当你添加collapse到fieldset类时,它获得了功能,但开始时是折叠的。我已经看过显示/隐藏fieldset内容的JS,但它看起来不像有什么东西可以做我想做的事情,所以我想我得自己卷了。只是想在我努力之前检查一下。

uelo1irk

uelo1irk1#

admin.py:

class PageAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('title', 'content', )
        }),
        ('Other Informations', {
            'classes': ('collapse', 'open'),
            'fields': ('slug', 'create-date',)
        }),
    )

模板/应用程序标签/型号名称/变更表单.html:

{% extends "admin/model_name/change_form.html" %}

{% block extrahead %}
    {{ block.super }}
    <script src="{{ STATIC_URL }}admin/js/collapse-open.js" type="text/javascript"></script>
{% endblock %}

静态/管理/js/折叠打开.js:

(function($) {
    $(document).ready(function() {
        $('fieldset.collapse.open').removeClass('collapsed');
    });
})(django.jQuery);
mbjcgjjk

mbjcgjjk2#

我知道这是真实的的老,但我也刚刚遇到这个问题。经过思考的方式太难,我找到了一个简单的解决方案,似乎得到的工作完成涉及插件或额外的js。
在字段集构造内将“collapse in”而不是“collapse”添加到类中:

fieldsets = [
    ('Start Expanded', {
    'fields': ['field1', 'field2', 'field3'], 
    'classes': ['collapse in',]
    })
]
avkwfej4

avkwfej43#

django-grappelli提供了这个特性,下面是wiki page关于这个特性的介绍(带有截图)。

cbeh67ev

cbeh67ev4#

配号与grappelli docs只需要添加“类”:(“组-折叠组-关闭”)
例如

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

字符串
注意:如果你使用grappelli版本〈2.4使用'grp-closed'代替'collapse-closed'* 实际上'collapse-close'仍然是工作的但是建议使用新的类

doinxwow

doinxwow5#

从Setomidor的回答开始,我想建议一个更简单的替代方案,它完全符合你的要求(如果Grappelli显然不是一个选项)。
按照说明创建模板覆盖(admin/(app)/(model)/change_form.html),而不是删除“add”模型案例的可折叠效果,只需调用字段集折叠器的click方法(即带有显示/隐藏文本的小链接),以便在页面加载后立即展开整个字段集。

t1qtbnec

t1qtbnec6#

我能找到的最快的方法是向fieldset添加一个新类start-open

classes = ['collapse', 'start-open']

然后修改static/admin/js/collapse.js
发件人:

// Add toggle to anchor tag
    var toggles = document.querySelectorAll('fieldset.collapse a.collapse-toggle');
    var toggleFunc = function(ev) {
        ev.preventDefault();
        var fieldset = closestElem(this, 'fieldset');
        if (fieldset.classList.contains('collapsed')) {
            // Show
            this.textContent = gettext('Hide');
            fieldset.classList.remove('collapsed');
        } else {
            // Hide
            this.textContent = gettext('Show');
            fieldset.classList.add('collapsed');
        }
    };
    for (i = 0; i < toggles.length; i++) {
        toggles[i].addEventListener('click', toggleFunc);
    }

收件人:

// Add toggle to anchor tag
    var toggles = document.querySelectorAll('fieldset.collapse a.collapse-toggle');
    // NEW: select toggles to open
    var open_toggles = document.querySelectorAll('fieldset.collapse.start-open a.collapse-toggle');
    var toggleFunc = function(ev) {
        ev.preventDefault();
        var fieldset = closestElem(this, 'fieldset');
        if (fieldset.classList.contains('collapsed')) {
            // Show
            this.textContent = gettext('Hide');
            fieldset.classList.remove('collapsed');
        } else {
            // Hide
            this.textContent = gettext('Show');
            fieldset.classList.add('collapsed');
        }
    };
    for (i = 0; i < toggles.length; i++) {
        toggles[i].addEventListener('click', toggleFunc);
    }
    // NEW: open toggles
    for (i = 0; i < open_toggles.length; i++) {
        toggles[i].click();
    }
q0qdq0h2

q0qdq0h27#

老问题,但我遇到了同样的问题,并得出了一个答案,可以使用标准的django实现:
创建文件:admin/(app)/(model)/change_form.html,以使您的(app)的(model)使用该表单文件。
将以下代码添加到文件中:

{% extends "admin/change_form.html" %}

{% block extrahead %}
    <!-- Load superblock (where django.jquery resides) -->
    {{ block.super }}
    <!-- only do this on 'add' actions (and not 'change' actions) -->
    {% if add and adminform %}
    <script type="text/javascript">
        (function($) {
            $(document).ready(function($) {
                //Remove the 'collapsed' class to make the fieldset open
                $('.collapse').removeClass('collapsed');

                //Remove the show/hide links
                $('.collapse h2 a').remove();

                //Tidy up by removing the parenthesis from all headings
                var $headings = $(".collapse h2");
                $headings.each(function(i, current){
                    var str = $(current).text();
                    parenthesisStart = str.indexOf('(');
                    $(current).text(str.substring(0, parenthesisStart));
                });
            });                                 
        })(django.jQuery);                      
    </script>
    {% endif %}
{% endblock %}

有关使用django.jQuery而不是“常规”jQuery的更多信息,请参见:http://blog.picante.co.nz/post/Customizing-Django-Admin-with-jQuery--Getting--is-not-a-function/

ut6juiuv

ut6juiuv8#

所以这个对我很有效:

class PageAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('title', 'content', )
        }),
        ('Other Informations', {
            'classes': ('wide'),
            'fields': ('slug', 'create-date',)
        }),
    )
ozxc1zmp

ozxc1zmp9#

对于django4.x,这里是我的admin/js/collapse.js addstart-open在类中

'use strict';
{
    window.addEventListener('load', function() {
        // Add anchor tag for Show/Hide link
        const fieldsets = document.querySelectorAll('fieldset.collapse');
        // NEW: select toggles to open
        var open_toggles = document.querySelectorAll('fieldset.collapse.start-open');        
        for (const [i, elem] of fieldsets.entries()) {
            // Don't hide if fields in this fieldset have errors
            if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) {
                if (elem.classList[3] != 'start-open') {
                    elem.classList.add('collapsed');
                }
                const h2 = elem.querySelector('h2');
                const link = document.createElement('a');
                link.id = 'fieldsetcollapser' + i;
                link.className = 'collapse-toggle';
                link.href = '#';
                if (elem.classList[3] != 'start-open') {
                    link.textContent = gettext('Show');
                } else {
                    link.textContent = gettext('Hide');
                }
                h2.appendChild(document.createTextNode(' ('));
                h2.appendChild(link);
                h2.appendChild(document.createTextNode(')'));
            }
        }
        // Add toggle to hide/show anchor tag
        const toggleFunc = function(ev) {
            if (ev.target.matches('.collapse-toggle')) {
                ev.preventDefault();
                ev.stopPropagation();
                const fieldset = ev.target.closest('fieldset');
                if (fieldset.classList.contains('collapsed')) {
                    // Show
                    ev.target.textContent = gettext('Hide');
                    fieldset.classList.remove('collapsed');
                } else {
                    // Hide
                    ev.target.textContent = gettext('Show');
                    fieldset.classList.add('collapsed');
                }
            }
        };
        document.querySelectorAll('fieldset.module').forEach(function(el) {
            el.addEventListener('click', toggleFunc);
        });
    });
}

相关问题