我的数据库模型就像
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 端执行此操作的方法。或者我必须为此创建一个自定义管理员?
您可以创建一个代理模型,然后稍微更新查询集以满足您的要求。
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)
将其添加到您的 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 文档
中的屏幕截图所示