【问题标题】:How not to display a field when it's None in Django如何在 Django 中为 None 时不显示字段
【发布时间】: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

【问题讨论】:

  • stackoverflow.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" ... 等等。
  • 不,我仍然没有。此外,为什么是“和”?它永远不会把所有这些东西放在一起。

标签: django django-models


【解决方案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) 并检查输出是什么。在模板和终端/
猜你喜欢
  • 2016-06-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多