2

有一個在Twitter的一個功能叫做從郵件中提取標籤#標籤。
例如,在劃分視圖與模板之間的責任在Django

"Hey #guys, I love #stackoverflow" 

#guys#stackoverflow是可以點擊的,並導致自己的查詢。

我正在構建一個類似的應用程序進行培訓,我不知道何時何地在輸出中實際注入鏈接?

我抓住所有最近的鳴叫:

def index(request): 
    latest_tweets = Tweet.objects.all().order_by('-pub_date')[:5] 
    return render_to_response('index.html', 
           { 'tweets': latest_tweets }, 
           context_instance=RequestContext(request) 
          ) 

並且以塊爲我呈現:

{% for tweet in tweets %} 
    <p>{{tweet.message}}</p> 
{% endfor %} 

但這當然只是表明普通消息,沒有鏈接。
我想在每個message#tag在查詢字符串到一個名爲by_tag視圖傳遞標籤名稱的鏈接來代替。

是否插入<a href="..."> s屬於views.py?那麼,如果我決定以後這是一個AJAX鏈接?好吧,看起來這屬於模板。但我怎麼做,從一個模板路由這樣一個複雜的更換?我應該寫一個自定義模板過濾器嗎?

僅供參考,Tweet包含它的Tag在一個名爲tags的字段中。

回答

4

我上週類似的做了,並寫了一個快速的定製template filter掃描文本尋找提到和井號標籤和鏈接他們包裹。

https://gist.github.com/1023144

這是有道理的在模板級別爲您正在執行HTML標記/更換做到這一點。

通常,您的視圖執行路由邏輯,即採取URL,檢索和聚合必要的數據,並呈現模板。

如果您需要在模型上執行任何關聯的邏輯(例如,比較tweets),將它放在模型函數或模型管理器中是個好主意,因爲它與您的邏輯關係模型和數據庫。

在在模板級別的任何邏輯通常應該處理所述結構化並顯示它已經從該視圖中接收的數據。

有時候,您可能想要在模板級別執行一些邏輯,以便可以在不同視圖之間重複使用它(例如抓取前10個最受歡迎的標籤)。這是創建一個模板標籤來執行邏輯的好時機(和它也很好的和可重複使用的)

無論如何,地方代碼:

yourapp/templatetags.py 

,並在模板:

{% for tweet in tweets %} 
    <p>{{ tweet.message|twittify }}</p> 
{% endfor %} 
+0

感謝您提供精彩的解釋和代碼片段。現在我想知道:是否可以將模板中的應用程序鏈接硬化?例如,在ASP .NET MVC中,而不是像'/ product/create /'那樣指定URL,我們調用Url.Route('Product','Create')'它讀取路由表並給出控制器和動作名稱的URL。這通常在django中完成? (考慮到我希望鏈接到'name'參數的'by_tag'視圖) – 2011-06-14 00:58:59

+1

是的,你可以得到這個功能。如果您想在視圖或應用程序邏輯中查找URL,請使用反向函數:(https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse)或者如果您要在模板中使用「url」模板標記實現相同的功能:(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#url)。如果你不能工作,打開一個新的問題,你將能夠得到幫助 – 2011-06-14 01:11:01

+0

這些鏈接都是我需要的,我發誓我可以找到他們,如果我更難搜索。非常感謝你的幫助! – 2011-06-14 01:12:59

相關問題