2010-03-26 141 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

相關問題