2013-04-15 47 views
0
{% for url in urls %} 
    <a id="URL_url_{{ url.id }}" class="edit_rightclick" 
     title="RIGHT click to edit." 
     href="{% if ":" not in url.url %}http://{% endif %}{{ url.url }}">{{ url.url }}</a> 
    <span class="delete" id="URL_{{ url.id }}">&amp;#10008;</span> &nbsp; 
{% endfor %} 

啓發式是爲了預先設定像google.com這樣的部分或完整網址的價值,假設有時候人們會粘貼完整的瀏覽器網址,有時候人們會輸入google.com並且從不輸入' HTTP://」。我的Django模板使用if有什麼問題?

模板引擎抱怨'{%if「:」not in url.url%}'是無效的語法。這裏的正確語法/方法是什麼?

+1

你爲什麼不歸它在你的服務器端邏輯,而不是模板? – Blender

+0

http://很醜。我可以在模板中存儲具有完整地址的URI,也可以通過存儲顯示URL和實時使用URL來使我的代碼更加複雜。現在,我想要調試的20-30個字符的代碼片段可能比重構服務器端的東西的調試要少,因此它可以跟蹤所有這些。 – JonathanHayward

+0

你將不會被稱爲'https://'鏈接,對吧? – Blender

回答

0

作爲使用內聯模板語句或模板過濾器的替代方法,您可以在模型上創建一個方法/屬性來處理url創建邏輯。假設您的網址是一個模式:

class Url(models.model): 
    url = model.TextField() 

    @property 
    def full_url(self): 
     if ":" not in url.url: 
      .... 
     return full_url 

,並直接在模板中使用

href="{{ url.full_url }}">{{ url.url }}</a> 

模板保持乾淨和免費的「商業邏輯」,它可以是一個很好的方法例如如果你有設計師創建HTML/CSS模板

編輯:這也釋放您在full_url財產執行更高級的邏輯(比如檢查垃圾郵件,斷開鏈接等)

+0

「這也可以讓你在full_url屬性中執行更高級的邏輯(比如檢查垃圾郵件,斷開的鏈接等),」你也可以在過濾器中這樣做。如果這變得複雜 - 業務邏輯不應該在Url類或templatetags模塊中。我知道這兩種方法都很好,但我個人更喜歡將models.model中的任何東西都保持簡單(沒有模板或業務邏輯)。 –

+0

如果嚴格意義上是將單獨的數據塊從一種格式轉換爲另一種格式以渲染到模板,那麼過濾器肯定是要走的路。如果數據將通過其他方式訪問(例如,如果模型用於創建將在沒有模板的情況下訪問的python API),模型屬性是最佳實踐。 – perrygeo