Для 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)