2012-03-15 86 views
2

我試圖實現一些自定義模板標籤到更多一點與我的應用程序和結構它更好。 令人討厭的部分是,我按照教程類型的帖子獲得代碼&它仍然無法正常工作。在Django中實現自定義模板標籤時遇到困難

我試圖按照thiscurrent_time來實現一些標籤,但我得到的錯誤,我不明白。

首先,最新的帖子的過濾器,或在我的情況下,最新的屏幕給人 Exception Value: No module named gallery

我的項目被稱爲「S3gallery」,我的應用程序被稱爲「畫廊」和我的模式被稱爲「屏幕截圖」。標籤的模型arg在文檔中說,它使用app_name.Model_name,這是我給它的,所以我堅持這一點。

我的自定義標籤代碼如下所示;

from django.template import Library, Node 
from django.db.models import get_model 

register = Library() 

class LatestContentNode(Node): 
    def __init__(self, model, num, varname): 
     self.num, self.varname = num, varname 
     self.model = get_model(*model.split('.')) 

    def render(self, context): 
     context[self.varname] = self.model._default_manager.all()[:self.num] 
     return '' 

def get_latest(parser, token): 
    bits = token.contents.split() 

    if len(bits) != 5: 
     raise TemplateSyntaxError, "get_latest_screens tag takes exactly three arguments" 
    if bits[3] != 'as': 
     raise TemplateSyntaxError, "second argument to the get_latest_screens tag must be 'as'" 

    return LatestContentNode(bits[1], bits[2], bits[4]) 

get_latest = register.tag(get_latest) 

我嘗試加載使用{% load get_latest gallery.screenshots 5 as recent_screens %}我見過沒有在標籤使用「負荷」的例子模板,但如果我這樣做Django不識別標籤。我是否因此迷失了方向,但是我認爲我會走向正確的道路。 對此的任何幫助將不勝感激:)

回答

5

{% load %}模板標記用於加載您的自定義模板標記,而不是呈現它。如果您get_latest標籤模塊my_tags.py中定義,那麼就應該用

{% load my_tags %} 

請參閱該文檔的code layout部分獲取更多信息加載它。

一旦你加載的標籤在你的模板,那麼你可以使用它:

{% get_latest gallery.screenshots 5 as recent_screens %} 
+1

輝煌。謝謝。現在,這使得更多的意義,我的標籤現在不會給出錯誤,並顯示當前時間,所以朝着正確的方向邁出了一步:D – 2012-03-15 14:21:32

2

聽着,我花了一段時間來了解這一點,因爲它是一個新的功能,所以沒有的博客有它,但 - 你知道關於simple_tag

如果你確實知道它,我很抱歉,但對於我自己的情況99%,我有這個訣竅(沒有解析器)。

下面是一些實際的代碼我實際部署今早使用它:

from django import template 

from ost2.api.hostname import app_reverse, app_reverse_lazy 

register = template.Library() 

@register.simple_tag(name="app_url") 
def app_url(namespaced_url, prefix=None, *args, **kwargs): 
    return app_reverse(namespaced_url, args=args, kwargs=kwargs, prefix=prefix) 

...這是就像你會認爲:{% app_url yodogg="I heard you like tags" %} ...參數工作就像在函數調用。

+1

沒有我只用了約2周的Python和Django約一個一週,所以我沒有聽說過這些東西!我只是看着,雖然它看起來很有幫助。我的下一個工作是移動一個函數來加載按鈕按下從S3加載內容到我的數據庫。這應該有所幫助,謝謝。 – 2012-03-15 14:28:20

+0

很高興聽到它。 'simple_tag'還有一個表達式'inclusion_tag',這對於您的標記代碼與模板強烈耦合的情況而言更爲簡單。無論你在遊戲中呆了多久,這些東西都不是很明顯,因爲在1.0版本中有大量的django博客文章,他們仍然拉動谷歌的體重。無論如何,祝你好運先生。 – fish2000 2012-03-15 14:46:49