2011-09-28 90 views
25

我正在尋找一個django設置或編程方式,以使所有django模板標籤在值爲None時顯示空字符串。例如,假設我有一些Django的模板:變量爲None時,默認模板標籤輸出的Django設置是什麼?

{{cat}} chases {{mouse}} 

如果兩個貓捉老鼠是無,這將呈現爲:

None chases None 

我知道我可以設置每一個使用{{cat|default:""}}{{mouse|default_if_none:""}}

但是,我正在尋找某種設置,可以讓我設置所有標籤的默認設置,而不必爲每個標籤添加|default:""

我也知道一個叫TEMPLATE_STRING_IF_INVALID的設置。但是,此設置僅適用於無效字符串。沒有被認爲有效。

回答

34

沒有這樣的事情存在。這就是爲什麼defaultdefault_if_none過濾器存在。這是一個功能;它會讓你思考自己在做什麼,而不是依賴一些往往會引起誤解的行爲。如果潛在的變量是None,那麼你應該爲這個意外事件做好計劃。如果變量應該總是有的某個值,那麼「無」表示某些不正確。如果默認是僅呈現空白字符串,那麼您不知道該值是否未定義或實際上是空白字符串。編寫一致的代碼並忘記快捷方式。

+4

+1因爲「顯式優於隱式」。 – jathanism

+0

這樣做很有意義,謝謝! – zzz

+0

跛腳。 「容易請求寬恕超過許可」發生了什麼?恐怕這不是Pythonic,並且完全沒有遵循DRY--在任何地方都會寫'default_if_none'!爲了規避這個「特性」,'forms.fields.CharField'永遠不會返回None,因此最好存儲空字符串DB ...是的,當然:P - 抱歉吹牛,我忍不住自己。 –

4

「顯式優於隱式」的你會怎麼激怒是當事情不能正確渲染,因爲你忘了,你已經啓用了神奇的「渲染虛假的值作爲空字符串一切」

思考設置。

如果您發現您正在使用default_if_none過濾器,您可能需要考慮在將模型傳遞到模板之前將鑄件None更改爲''

您的模板將會更簡單,並且您將有明確作出這個決定將空值串聯起來。

3

這應該做的伎倆,把它放在初始化代碼的某處,例如。 in wsgi.py

# Patch template Variable to output empty string for None values 
from django.template.base import Variable 
_resolve_lookup = Variable._resolve_lookup 
def new_resolve_lookup(self, *args, **kwargs): 
    o = _resolve_lookup(self, *args, **kwargs) 
    return o or u"" 
Variable._resolve_lookup = new_resolve_lookup