对于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)