2013-07-17 64 views
2

我想轉換字符串在Django模板列表:如何轉換字符串中的Django模板列出

數據:

{u'productTitle': u'Gatsby Hard Hair Gel 150g', u'productPrice': 0.0, u'productMRP': 75.0, u'hasVariants': 0, u'productSite': u'http://www.365gorgeous.in/', u'productCategory': u'', u'currency': u'INR', u'productURL': u'http://www.365gorgeous.in/gatsby-hard-hair-gel-300g-1.html', u'productDesc': u'A Water type hair gel with is hard setting and gives hair a firm hold It is non sticky hard setting and smooth to the touch Firm hold with wet look spikes', u'productSubCategory': u'', u'availability': 0, u'image_paths': u'["full/548bc0f93037bd03340e11e8b18de33b414efbca.jpg"]'} 

我想從上面的字典中提取圖像路徑,但圖像路徑在串u'["full/548bc0f93037bd03340e11e8b18de33b414efbca.jpg"]'是有什麼辦法可以把它轉換成["full/548bc0f93037bd03340e11e8b18de33b414efbca.jpg"]內模板...我知道它可以在視圖中進行,但我可以做這個模板....

+4

請問爲什麼這是一個字符串呢? – rantanplan

+3

......以及爲什麼你不想將邏輯放在你的視圖中它屬於哪裏? – arie

+0

我同意這種事情不應該由模板處理。如果你將它存儲爲json,當你訪問該字段時,會有很多包將自動處理序列化和反序列化。下面是一個例子:https://github.com/bradjasper/django-jsonfield – Ngenator

回答

3

你可以write a template filter運行字符串通過json dec頌。

{% for image_path in data.image_paths|your_custom_json_decode_filter %} 
    {{ image_path }} 
{% endfor %} 

雖然這不是一個好主意,但爲什麼不在你的視圖中這樣做呢?

+3

我認爲這不是一個好的方式,因爲在將來他可能會有另一個源碼不會格式化他的字典和image_paths。他最好不得不通過使用一個對象來抽象它,或者在他看來做這個工作。 但您的答案將按預期工作。 – gpichot

+2

哦,我的上帝爲什麼?他可以編寫一個編譯器作爲模板過濾器 - 他應該這樣做嗎?這裏的工作明顯有缺陷。 – rantanplan

+1

很明顯,在這裏使用某種API,如果有一天他想支持另一個API呢?他將不得不重寫模板和視圖。如果他想保留一個長期的MVC項目,那麼在模板中使用這種邏輯不是一個好方法。 – gpichot

0

模板過濾器是您的最佳選擇,因爲沒有內置模板標籤來評估字符串。如果你想在模板中轉換它,那是你最好的選擇。但是,如果在將數據發送到模板之前修改數據,那麼在python中構建模板過濾器就沒有多大意義。無論哪種方式,你將不得不在python中做些什麼。 如果你打算使用此模板過濾器是一個例子:

@register.filter # register the template filter with django 
def get_string_as_list(value): # Only one argument. 
    """Evaluate a string if it contains []""" 
    if '[' and ']' in value: 
     return eval(value) 

,然後在模板中,您將要循環的關鍵,在你的字典中的值和值傳遞給您的自定義模板過濾器等等:

{% for image_path in data.image_paths|get_string_as_list %} 
    {{ image_path }} 
{% endfor %} 
+0

這太不安全了...... [Eval真的很危險](http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) – Ngenator

+0

如果你有** untrusted **輸入,'eval'只會是危險的。他的數據顯然來自數據庫,並且是服務器端的圖像路徑。他應該是安全的,如果沒有,他的過濾器可以檢查有效性。 –

+0

@ notbad.jpeg假定輸入數據庫的數據是有效的。當解碼json是一個選項時,應該不需要使用eval所涉及的風險。 – Ngenator

相關問題