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_permissionget_formsget_formsetget_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)

最新更新