在 Django Admin 中显示我的模型数据的子集

问题描述 投票:0回答:2

我的数据库模型就像

class Restaurant(models.Model):
    email_sent = models.BooleanField(null=True, default=False)
    rest_owner = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='rest_owner')
    is_approved = models.BooleanField(null=False, default=False)

我想创建一个单独的表,在其中可以仅显示 is_approved=0 的字段的数据。在 django 站点中很简单。但我无法找到在 djangoAdmin 端执行此操作的方法。或者我必须为此创建一个自定义管理员?

django django-models django-admin
2个回答
4
投票

您可以创建一个代理模型,然后稍微更新查询集以满足您的要求。

class UnapprovedRestaurant(Restaurant):
    class Meta:
        proxy=True

class UbapprovedRestaurantAdmin(admin.ModelAdmin):
    def get_queryset(self, *args, **kwargs):
        return Restaurant.objects.filter(is_approved=False)

admin.site.register(UnapprovedRestaurant, UbapprovedRestaurantAdmin)

如果您不想将这两种状态的管理页面分开。然后我建议您为管理页面创建自定义过滤器,以便您可以根据定义的条件过滤数据,如下所示:

class RestaurantFilter(admin.SimpleListFilter):

    def lookups(self, request, model_admin):
        return (
            'approved': 'Approved',
            'unapproved': 'Unapproved'
        )

    def queryset(self, request, queryset):
        value = self.value()
        if value is None:
            return queryset
        elif value == 'approved':
            return queryset.filter(is_approved=True)
        elif value == 'unapproved':
            return queryset.filter(is_approved=False)

class RestaurantAdmin(admin.ModelAdmin):
    list_filter = (RestaurantFilter, )

admin.site.register(Restaurant, RestaurantAdmin)

3
投票

将其添加到您的 admin.py 中:

from django.contrib import admin
from .models import Restaurant

def mark_approved(modeladmin, request, queryset):
    queryset.update(is_approved=True)
mark_approved.short_description = "Mark selected restaurants as approved."

class RestaurantAdmin(admin.ModelAdmin):
    list_filter = ('is_approved',)
    actions = ('mark_approved',)

admin.site.register(Restaurant, RestaurantAdmin)

然后您应该能够转到 Django 管理员,并在那里看到餐厅链接。从那里您可以根据 is_approved 是否为真来过滤您的列表。

要将餐厅标记为已批准,请在列表中选择它们,然后单击操作下拉列表,如 Django 文档

中的屏幕截图所示
© www.soinside.com 2019 - 2024. All rights reserved.