2012-03-15 5 views
2

내 앱으로 좀 더 많은 사용자 정의 템플릿 태그를 구현하여 더 잘 구조화하려고합니다. 성가신 부분은 자습서 형식의 게시물을 따라 코드 &을 얻은 것입니다. 그래도 작동하지 않습니다.Django에서 사용자 정의 템플릿 태그를 구현하는 데 문제가 있습니다.

일부 태그를 구현하기 위해 thiscurrent_time을 따르려고했지만 이해가 안되는 오류가 나타납니다.

우선, 최신 게시물의 필터, 또는 내 경우 최신 화면에 내 응용 프로그램은 '갤러리'라고하며 나의 모델은 '스크린 샷'라고, 내 프로젝트 'S3gallery'라고 Exception Value: No module named gallery

제공합니다. 태그의 모델 인자는 docs에서 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 %}를 사용하여 템플릿과 내가 태그에 '부하'를 사용하지 않는 본 적이 예제에서 그것을로드하려고하지만 난 할 경우 장고 태그를 인식하지 않습니다. 나는 그것에 의해 길을 잃었지만, 나는 올바른 길로 가고 있다고 생각합니다. 이것에 대한 도움은 크게 감사 할 것입니다.

답변

5

{% load %} 템플릿 태그는 사용자 정의 템플릿 태그를로드하고 렌더링하는 데 사용됩니다. 당신의 get_latest 태그가 모듈 my_tags.py에 정의되어있는 경우, 당신은

{% load my_tags %} 

자세한 내용은 해당 문서의 code layout 섹션을 참조 사용하여로드해야합니다.

당신이 당신의 템플릿에 태그를로드하면

, 당신은 그것을 사용할 수 있습니다

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

브릴리언트. 고맙습니다. 이제는 더 많은 의미가 있으며 두 태그 모두 오류를주지 않고 현재 시간이 표시되므로 올바른 방향의 한 단계가됩니다 : D –

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는 약 2 주 나는이 재료의 많은 것을 듣지 않았다! 나는 그것이 도움이되는 것처럼 보였지만 단지 그것을 보았다. 내 다음 작업은 S3에서 내 DB로 콘텐츠를로드하기 위해 버튼을 누르는 기능을 이동하는 것입니다. 고마워, 고마워. –

+0

다행입니다. 'simple_tag' 또한 사촌'inclusion_tag'을 가지고 있습니다. 이것은 태그 코드가 템플릿에 강하게 결합되어있는 경우를위한 것이며, 더 간단합니다. 이 기사 중 일부는 게임에 얼마나 오래 있었는지에 관계없이 분명하지 않습니다. 왜냐하면 1.0 버전을 중심으로 여러 장고의 블로그 기사가 있었기 때문에 이들 모두는 여전히 Google의 무게를 이끌어 냈습니다. 어쨌든, 행운을 빕니다. – fish2000

관련 문제