【问题标题】:django admin list data using default filterdjango admin 使用默认过滤器列出数据
【发布时间】:2021-06-23 14:45:41
【问题描述】:

我有这样的模型

### models.py
class Pizza(models.Model):
    name = models.CharField()
    price = models.IntegerField()
    have_recipe = models.BooleanField()

### admin.py
admin.register(Pizza)
class PizzaAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'price')
    exclude = ('have_recipe',)

当我输入localhost:8000/admin/pizza 时,我可以看到所有的披萨对象,

但是,我想让管理员披萨列表仅显示 have_recipe=True 对象,并且没有人无法在管理员页面中控制此过滤器

有什么解决办法吗??

【问题讨论】:

标签: django


【解决方案1】:

您可以覆盖get_queryset(…) method [Django-doc] 并使用:

# admin.py

@admin.register(Pizza)
class PizzaAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'price')
    exclude = ('have_recipe',)
    
    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            have_recipe=True
        )

您还应该使用@admin.register(Pizza) 作为装饰器,因此使用前导@

【讨论】:

  • 这里的小错误,在文档中get_queryset 只需要request。应该是def get_queryset(self, request),超级调用应该是super().get_queryset(request).filter(...)
  • @DeanElliott:但这也有效。通常在这里使用*args**kwargs 会更好,因为(a)它更容易理解我们执行超级调用,并且(b)mixin 可以稍微改变get_queryset 及其调用者。最后 (c) 以后版本的 Django 可能会重新定义 get_queryset 函数,所以在这种情况下,我们不会让它特定于版本来进行超级调用。
  • 我的错,那么这里没有错误,如果您要更改参数,但我建议使用支持您的 B 和 C 点的 get_queryset(self, request, **kwargs),但使用显式 request 参数更具可读性。这里有一些很好的讨论:stackoverflow.com/questions/14626279/…
  • 使用与否在这里并不重要。您的解决方案当然效果很好,并将帮助@JadeHan 回答他们的问题。忽略我:)
  • @DeanElliott:我认为在这种情况下使用@wraps 装饰器会更好,这样原始方法的参数仍会显示为help(PizzaAdmin.get_queryset)。但我同意使用request*args 是基于意见的。 :)
猜你喜欢
  • 2012-05-11
  • 2010-10-25
  • 2022-01-01
  • 2011-01-12
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多