Django BooleanField默认值不显示False显示'-'问题求助
一、'-'代表什么?
你看到的'-'是Django Admin用来表示**空值(None)**的符号。核心原因是:你的Completed模型和User是一对一关联,但新建User时,Django不会自动创建对应的Completed实例——模型里的default=False是创建Completed对象时才会生效的规则,不是User创建时自动生成关联实例的逻辑。此时User没有对应的Completed记录,Admin展示该字段时就用'-'表示关联对象不存在。
另外先提下你代码里的明显问题:admin.py中定义的Inline类名叫Company,但关联的model是Completed,这极易混淆;而且can_delete: False是语法错误,要改成can_delete = False(用等号赋值,不是冒号)。
二、实现创建时显示False的几种方案
方案一:新建User时自动创建Completed实例(推荐)
用Django的post_save信号,让User创建完成后自动生成对应的Completed对象,这样Admin列表里会直接显示默认的False。
在models.py末尾添加信号代码:
from django.db.models.signals import post_save from django.dispatch import receiver from django.conf import settings @receiver(post_save, sender=settings.AUTH_USER_MODEL) def create_completed_for_user(sender, instance, created, **kwargs): if created: # 自动创建关联的Completed实例,使用默认的completed_application=False Completed.objects.create(user=instance)
方案二:自定义Admin列表显示,空值时返回False
如果不想自动创建Completed实例,只是想把列表里的'-'替换成False,可以修改UserAdmin里的completed展示方法:
在UserAdmin类中添加:
def completed(self, obj): # 尝试获取关联的Completed实例,没有则返回False return getattr(obj.completed, 'completed_application', False) # 给列表列设置显示标题 completed.short_description = '是否完成申请'
方案三:修复Inline配置,新建User时直接生成Completed记录
先修正Inline的命名和语法错误,让新建User页面显示Completed的表单,保存时自动创建实例:
# admin.py中替换原Company Inline类 class CompletedInline(admin.StackedInline): model = Completed can_delete = False verbose_name_plural = 'Completed Application' # 然后修改UserAdmin的inlines class UserAdmin(UserAdmin): # ... 其他代码不变 inlines = [CompletedInline]
这样在新建User的页面会显示Completed的勾选框,默认是未勾选(对应False),保存User时会自动创建Completed实例,之后列表里就会显示False了。
内容的提问来源于stack exchange,提问作者Olney1

