Django中通过Boolean字段控制Birthday模型显示People数据的需求
解决Django Admin中Birthday模型仅显示活跃用户的问题
要实现仅显示关联活跃(State=True)People的Birthday记录,同时在添加/编辑Birthday时只能选择活跃用户,只需在项目的admin.py中自定义Birthday的Admin类即可,具体步骤如下:
1. 自定义BirthdayAdmin类
在admin.py中导入所需模型,然后编写如下代码:
from django.contrib import admin from .models import People, Birthday class BirthdayAdmin(admin.ModelAdmin): # 重写查询集,仅显示关联活跃用户的Birthday记录 def get_queryset(self, request): qs = super().get_queryset(request) return qs.filter(People_Birthday__State=True) # 重写外键字段的查询集,仅显示活跃用户选项 def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'People_Birthday': kwargs['queryset'] = People.objects.filter(State=True) return super().formfield_for_foreignkey(db_field, request, **kwargs) # 注册自定义的Admin类 admin.site.register(People) admin.site.register(Birthday, BirthdayAdmin)
代码说明
get_queryset方法:修改Admin列表页的查询结果,过滤掉关联People的State为False的Birthday记录,确保列表只显示活跃用户的生日信息。formfield_for_foreignkey方法:在添加或编辑Birthday时,限制People_Birthday下拉框仅展示State=True的用户,避免误选非活跃用户。
原模型代码(参考)
class People(models.Model): Name = models.CharField('Name', max_length = 20, blank = False, null = False) Last_Name = models.CharField('Last Name', max_length = 20, blank = False, null = False) State = models.BooleanField('Active Client', default = True) class Meta: verbose_name = 'People' verbose_name_plural = 'People' ordering = ['Name'] def __str__(self): return "{0} - {1}".format(self.Name, self.Last_Name.capitalize()) class Birthday(models.Model): People_Birthday = models.OneToOneField(People, on_delete = models.CASCADE) BirthdayCalendar = models.DateField('Birthday', blank = False, null = False) class Meta: verbose_name = 'Birthday' verbose_name_plural = 'Birthdays' def __str__(self): return str(self.People_Birthday)
内容的提问来源于stack exchange,提问作者Diego Ordenes Vargas
相关产品推荐
相关产品推荐

