2014-04-03 74 views
2

我最近開始使用Django的模板,我經常發現在別人的代碼如下模式: Django模板和DRY - 如何避免重複HTML

{% ifequal value 1 %} 
     <input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" checked="checked" /> 
    {% else %} 
     <input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" /> 

和Django模板變量條件正在使用

定義一個或多個HTML元素屬性的值。這複製HTML代碼並打破DRY原則。我怎麼能避免這種情況?

替代我已經考慮:

1)嵌入所檢查的屬性的條件。

  • 臨:兼容DRY-
  • 缺點:使得代碼難以閱讀,特別是如果條件是更復雜的,多個HTML元素屬性使用模板變量操縱

2)定義的Javascript變量值並使用Javascript生成HTML元素。

  • 臨:符合DRY-
  • 缺點:移動邏輯客戶端

建議,歡迎。

+2

解決這個問題的真正方法當然是使用Django的窗體框架。 –

回答

2

我不認爲這段代碼有什麼問題。它可能會破壞一些DRY,但代碼最終非常易讀和可維護。從Zen of Python

兩個核心理念是

明確的是比隱

可讀性更好計數

通過JavaScript生成HTML是DEFI儘管不會顯式,但在元素中添加條件會影響可讀性。

1

在你的榜樣,您可以簡化的東西相當多的(見下圖):

<input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" {% ifequal value 1 %}checked="checked"{% endif %} /> 

正如你所看到的,有沒有必要在這裏重複的代碼 - 你可以嵌入裏面的if語句HTML保存文本。

+0

這是替代方案1我在我的問題中提到 –

0

作爲第三個選項,您可以使用您的視圖來控制checked="checked"部件。

製作一個名爲例如"checked"附加到您的每個項目,並將根據事實,如果值爲1或不管您的條件將保留一個空字符串(不是None)或checked="checked"

,這將讓你寫:

<input type="checkbox" name="{{ item.name }}" id="{{ item.name }}" {{ item.checked }} /> 

這適用於幹普林西比,它仍然是明確的。雖然這將轉移到你的看法。

+0

但後來UI細節由後端處理,這不是好的恕我直言。 –

+0

我願意同意Alan,因爲我知道你來自哪裏。不過,我想引用Django文檔:「視圖本身包含任何必需的邏輯來返回該響應。」所以它基本上說,你可以把這個邏輯放在你的視圖或你的模板中。所以你會決定更多的適合或整體設計。我並不是說模板內處理是錯誤的。它只是...取決於... –