2012-04-19 3 views
0

개체의 항목 모음이있는 문자열을 반환하는 템플릿 태그를 구현해야합니다.장고 사용자 지정 템플릿 태그 구현 문제

나는 다음과 같은 구조를 만들었다

:

produtos/   
    templatetags/ 
     __init__.py 
     produto_tags.py 

produto_tags.py :

# -*- coding: utf-8 -*- 

from django import template 
from django.template import Node 
from produto.models import Produto 
from django.template.loader import render_to_string 

register = template.Library() 

@register.tag 
def get_all_tags(parser, token): 
    args = token.split_contents() 
    return ProdutoTemplateNode(args[1]) 


class ProdutoTemplateNode(Node): 
    def __init__(self, produto): 
     self.produto = produto 

    def render(self, context): 
     list = [] 
     produto = template.Variable(self.produto).resolve(context) 
     tags = produto.tags.all() 
     if tags: 
      for tag in tags: 
       list.append(tag.name) 
      return ", ".join(list) 
     else: 
      return u'Não existem tags para este produto' 

템플릿 :

{% load produto_tags %} 
... 
    {% for produto in produtos %} 
     <li id="{{ produto.ordenacao }}" data-tags="{% get_all_tags produto %}"> 
      ... 
     </li> 
    {% endfor %} 
    </ul> 
{% else %} 
    <p>Não existem produtos cadastrados no sistema</p> 
{% endif %} 

나는이 오류 받고 있어요 :

TemplateSyntaxError at /concrete/nossos-sites.html 
Invalid block tag: 'get_all_tags', expected 'empty' or 'endfor' 

나는 태그가 존재하지 않고 그럴듯한 것처럼 보이는 경우 사람들이이 오류를 말한 다른 스레드를 읽었습니다. 나는 djangoproject.com 문서를보고 있었고 무슨 일이 일어날 지에 대한 단서를 찾을 수 없었다.

감사합니다.

답변

2

produtos/templatetags /에서 common/templatetags /까지입니다. 하지만 제가 장고를 만들 때 장고는 produtos에서 produtos_tags를 찾지 못하도록 울부 짖기 시작했습니다. 그 후 나는 produtos/templatetags 다시 코드를 가지고/아래 내 잘못 수입이다 쉬운 부분을 표시하기 위해 노력했던 것을 tags_produtos.py 할 파일을, 이름 :

잘못된 :

from produto.models import Produto 

올바른 :

from produtos.models import Produto 
-1

대신 {{ produto | get_all_tags }}을 사용하십시오.

{% ... %} 구문은 for과 같은 블록 태그에만 유효합니다.

희망이 있습니다.

+1

필터는'@ register.tag'이 아니라'@ register.filter'를 사용합니다. –

3

템플릿 태그 파일은 앱 내부에 templatetags이라는 디렉토리 안에 있어야합니다.

+0

Daniel, 설명에 실수를하였습니다. 지금 설명을 수정했습니다. – fmondaini

+1

template_tags가 아닌 templatetags +1 –

+0

아! 또 다른 오타! 죄송합니다! – fmondaini

2

다니엘과 이그나시오의 제안을 먼저 따르십시오. 또한 이상한 템플릿의 상단에 {% load produto_tags %}이 있지만 유효하지 않은 블록 오류가 발생했습니다. produto_tags을로드 할 수없는 경우 'produto_tags는 올바른 태그가 아닙니다'와 같은 오류가 발생해야합니다. 다시 게시 한 코드 및 경로 구조를 확인하십시오. 나는 모든 코드를 이동 한 처음,

project/ 
    common/ 
     templatetags/ 
      produtos_tags.py 
    produtos/ 
     templatetags/ 
      produtos_tags.py 

: 그럼, 다른 프로젝트의 다른 폴더에있는 또 다른 'produto_tags.py이'가 있었다

첫째, 심지어 단순하지만, 신중해야

+0

방금 ​​답변을 게시했습니다. 다른 앱의 동일한 이름을 가진 다른 templatetag 파일 때문에 충돌이 발생했습니다. 감사 – fmondaini