2010-03-26 97 views
3

有没有办法强制django为空白的Decimal字段显示任何内容而不是“None”?Django DecimalField返回“None”而不是空值

在我的模板中,我显示了一个特定字段的所有值的列表。每个值都超链接到一个页面,该页面显示按该值过滤的查询结果。但是由于有一些空值的条目,我的列表中包含实际的DecimalField条目,而所有那些为空的条目都包含“None”。当用户点击None时,django会抛出验证错误,因为您无法使用字符串查询DecimalField。

我可以编写if语句来检查Nones的所有十进制字段的实例并跳过它们,但这远非优雅的解决方案。有什么建议?

这是代码的一部分,但也有在略微不同的方式推导出无其他有价值的模板:

{% for item in choices %} 
    <a href={% url app_views.field_choice item %}>{{ item }}</a><br> 
{% endfor %} 

回答

15

如果不希望过滤值列表,你可以使用内置的defaultdefault_if_none模板过滤器来控制显示的内容,但通过上面给出的示例,您最终将获得空链接。

{{ item|default_if_none:"" }} 

鉴于你需要超链接,并查询每个值,这是会显示一个错误,如果没有给出一个数,我筛选,当你将它传递给模板上下文中的列表视图:

{"choices": [choice in choices where choice is not None]} 
0

好吧,让我们假设你让Django返回一个空字符串,而不是空值。

所以现在有了这个代码会发生什么:

{% for item in choices %} 
<a href={% url app_views.field_choice item %}>{{ item }}</a><br> 
{% endfor %} 

你要么:

  • 得到一堆空链接(<a href="/field_choice/"></a>
  • 或异常的形成URL翻转机构(因为位置参数是必需的)。

你不想使用的方法是更优雅(!):

{% for item in choices %} 
    {% if item %} 
     <a href={% url app_views.field_choice item %}>{{ item }}</a><br> 
    {% endif %} 
{% endfor %} 

当然你也可以自由地建立一个没有空项的列表预先:在视图中,或甚至使用a custom manager

+0

好,因为没有只显示一次,我只会得到一个空的链接,这将是不可见的用户。 将1 if语句添加到循环会很好,但是如果/当我扩展模板以专门引用单个字段(而不是动态循环它们)时,我必须为每个字段编写if语句可能包含无的参考。 – 2010-03-26 16:46:52

+0

这是一个非常糟糕的做法,指望用户看不到链接,只是因为它们是空的。他们仍然在那里,而且他们会被使用的情况很多。 – 2010-03-26 16:57:09

+0

同意。我改变了视图以过滤出列表中无值的值。然后,我使用default_if_none筛选器筛选未预先过滤的模板 – 2010-03-26 17:49:08

相关问题