Есть ли способ сделать свернутый инлайн изначально видимым в админке Django, если у него есть значение?
Я программирую конструктор сайтов на Django, и на каждой странице есть множество полей для заполнения.
Некоторые из них довольно заумные, и чтобы не загромождать страницу, они изначально скрыты:
class ScriptInlinePage(admin.TabularInline):
model = Page.script.through
extra = 0
fields = ('active', 'script', 'order', )
verbose_name = "script set"
verbose_name_plural = "script sets"
classes = ['collapse']
В интересах оптимизации страницы я сделал так, чтобы свернутые инлайны были ненавязчивыми:
Наборы сценариев (Показать ▶)
Однако эти изначально скрытые поля могут иметь катастрофические последствия, если они содержат значение, а пользователь об этом не знает.
Я ищу способ либо:
- добавьте класс collapsed but initially visible if not empty, или
- модифицируйте класс collapse так, чтобы он был первоначально свернут, только если он пуст .
Я пробовал добавить в models.py что-то вроде:
def is_empty:
if self.count > 0: return True
else: return False
но я не знаю, как использовать эту информацию в классе Admin, чтобы получить нужный мне эффект.
Подобный вопрос: Мне казалось, что я видел способ сделать инлайн складным, не делая его изначально складным, но после долгих поисков в гугле я не могу его найти. Это не так?
Спасибо A D, который заставил меня искать в нужном месте, в итоге я скопировал админский javascript, который сворачивает свернутые элементы.
[папка app]/static/admin/js/ifempty.js
'use strict';
{
window.addEventListener('load', function() {
const fieldsets = document.querySelectorAll('fieldset.ifempty');
for (const [i, elem] of fieldsets.entries()) {
if (elem.querySelectorAll('div.related-widget-wrapper').length > 1) {
elem.classList.remove('collapse');
}
}
});
}
Тогда, в admin.py:
class PageAdmin(admin.ModelAdmin):
class Media:
js = ( 'admin/js/ifempty.js', )
...
В результате в inline я могу добавить ifempty к списку классов:
class ScriptInlinePage(admin.TabularInline):
model = Page.script.through
extra = 0
fields = ('active', 'script', 'order', )
verbose_name = "script set"
verbose_name_plural = "script sets"
classes = ['collapse', 'ifempty',]
Когда страница загружена, "скрытые" поля, имеющие значения, больше не скрыты.
Изначально я хотел бы сделать эти поля сворачиваемыми, но понял, что пользователи никогда не потрудились бы свернуть поле, которое изначально было видимым.
Таким образом, отмена класса коллапса, когда поле содержит данные, является идеальным решением.