Django - Добавлять классы в инлайн только если qs len больше 5
Для TaskInline я хотел бы отображать его свернутым, если в нем более 5 элементов:
from django.contrib import admin
from django.contrib.auth.models import User
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=50)
description = models.TextField()
performer = models.ForeignKey(User, on_delete=models.CASCADE)
class TaskInline(admin.TabularInline):
model = Task
def get_queryset(self, request):
qs = super().get_queryset(request)
if len(qs) > 5:
self.classes = 'collapse',
return qs
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
inlines = TaskInline,
Но трюк, реализованный в методе get_queryset, похоже, не работает (похоже, этот метод выбирает все элементы модели Task).
Где я должен сравнить len, чтобы добавить classes?
Нет "правильного" способа сделать это, но... Для достижения желаемого вы можете выбрать любой метод, принимающий аргумент obj. Например, has_view_permission или get_forms или get_formset или get_extra...
Обратите внимание, что вы не получите QuerySet связанного менеджера, а вместо этого получите obj, который запрашивается в неинлайн админке.
Пример:
class TaskInline(admin.TabularInline):
model = Task
def has_view_permission(self, request, obj=None, **kwargs):
# None for new instances or non object-specific calls
if obj is not None:
# print(obj) -> instance that has Task as inline
# TODO: fix the following line, because your field might be called differently
if obj.tasks.count() >= 5:
self.classes = list(type(self).classes or []) + ["collapse"]
return super().has_view_permission(request, obj=obj, **kwargs)