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)

Вернуться на верх