Django - 仅当 qs len 大于 5 时才将类添加到内联

发布于 2025-01-15 14:10:41 字数 804 浏览 3 评论 0原文

对于 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 来添加

For TaskInline I'd like to display it collapsed if there are more than 5 elements:

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,

But trick that is implemented in get_queryset method seems not working (it seems this method selects all the items of Task model).

Where should I compare len to add classes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

调妓 2025-01-22 14:10:41

没有“正确的”方法可以做到这一点,但是...为了实现您想要的效果,您可以选择任何接受 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)

There's no "proper" way to do so, but... To achieve what you want you can pick any method that accepts obj argument. Like has_view_permission or get_forms or get_formset or get_extra...

Note that you will not receive a QuerySet of the related manager, but instead will get the obj that is requested in the non-inline admin.

Example:


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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文