如何在 Django 中为 None 时不显示字段
Posted
技术标签:
【中文标题】如何在 Django 中为 None 时不显示字段【英文标题】:How not to display a field when it's None in Django 【发布时间】:2021-05-02 08:04:19 【问题描述】:我有这个模型:
class MsTune(models.Model):
name = models.CharField(max_length=255) # title (source)
start_page = models.CharField(max_length=20, blank=True, null=True, default=None)
def __str__(self):
if not self.start_page or self.start_page != '' or self.start_page is not None or self.start_page is not "None" or self.start_page is not null:
return '%s, %s' % (self.name, self.start_page)
else:
return '%s' % (self.name)
如您所见,如果start_page
为空,我只需要name
,如果start_page
已填充,我只需要name, start_page
。无论我设置了多少条件(见上文),我都会在模板中不断收到name, None
。我错过了什么?另外,我可以使用更短的代码来代替冗长的if / else
吗?
编辑
这是我在数据库中字段的内容:
mysql> SELECT start_page from bassculture_mstune where id = 1942;
+------------+
| start_page |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
在 Django 的 shell 中:
>>> mytune = MsTune.objects.get(id=1942)
>>> print(mytune.start_page)
None
【问题讨论】:
***.com/questions/6584235/… 的第二个答案使用内置的 default_if_none 过滤器。 当使用肯定条件时你会得到什么? if self.start_page: return '%s, %s' % (self.name, self.start_page) else: return '%s' % (self.name) 其实显示视图和模板会更有启发性。 视图是一个简单的tunes = MsTune.objects.all()
,模板只是% for tune in tunes % tune % endfor %
。正条件向模板显示字符串“title, None”。
我认为 if 语句不是你想要的......“或”是错误的逻辑。它应该类似于 ... is not "None" 并且 ... is not "Null" ... 等等。
不,我仍然没有。此外,为什么是“和”?它永远不会把所有这些东西放在一起。
【参考方案1】:
由于默认值将是 ""
与您的字段一样,因此只需检查 not value
应该可以:
def __str__(self):
returnVal = f"self.name"
if self.start_page:
returnVal = f"returnVal, self.start_page"
return returnVal
或者,你可以使用三元运算:
def __str__(self):
return self.start_page and f"self.name, self.start_page" or f"self.name"
Python三元运算:Refs
【讨论】:
从我上面的代码可以看出,我已经有了if self.start_page is not None
条件。我的主要问题是None
仍然显示。
@HBMCS 编辑,看看。
这也是我尝试的第一件事。我已将它添加到 'ifs' 的 loooong 列表中。仍然没有运气。数据是如何写入 MySQL 数据库的?我已经从 .sql 转储中导入了它。还有什么其他类型的 null/None/'none'?
@HBMCS 你可以试试:print(self.start_page)
并检查输出是什么。在模板和终端/以上是关于如何在 Django 中为 None 时不显示字段的主要内容,如果未能解决你的问题,请参考以下文章
ManytoMany 字段中的 Django ForeignKey 显示为 None