[django] 템플릿에 사용자 정의 표시 내용 (django tag)

2892 단어
최근에 django를 배워서 정의 django tag를 연습해 봤어요.기록해.
다음과 같은 두 개의 테이블을 정의했습니다.
#models.py
class package(models.Model):
   packageDetail = models.TextField()

class product(models.Model):
    id = models.CharField(max_length=30,primary_key=True)
    name = models.CharField(max_length=100)

그 중에서 패키지Detail 필드에 저장된 것은 하나의 제품표의 id로 ['id1','id2'와 같은 구조를 가진다.
views.py 코드는 다음과 같다. 기능은 주로 모든 패키지 내용을 표시하기 위한 것이다.
#views.py
def packagesIndex(request):
    packages = package.objects.all()    
    return render_to_response('tariffManagement/packageIndex.html',locals())

그리고 템플릿 index를 정의했습니다.html
#index.html

<table>
	<tr>
		<td>  </td>
	</tr>
	{% for package in packages %}
	<tr>
		<td>			
			{% load testTag %}
			{% getNames package.packageDetail %}			  
		</td>
	</tr>
	{% endfor %}
</table>

이 템플릿은 패키지 내용을 표시하고 제품 이름입니다.패키지 Detail 필드는 하나의 제품 id를 저장하기 때문에, 대응하는name으로 전환해야 합니다.
{% load testTag%} tag 파일을 로드하는 testTag입니다.py.
{% getNames package.packageDetail%}, getNames는 함수 이름, package.packageDetail은 일반 함수 호출과 유사한 형식으로 변환해야 하는 값입니다.
그런 다음 사용자 정의 tag 를 시작합니다.나는 우선 이 app 아래에서templatetags 폴더를 만들고 이 폴더 아래에 를 만든다init__.py 빈 파일 및 testTag.py 두 파일.testTag.py는 사용자 정의 태그입니다.코드는 다음과 같습니다.
#testTag.py
from django import template
from tables import product

register = template.Library()
@register.tag(name="getNames")
def getNames(parser,token):
    try:
        packageStr = token.split_contents()
    except ValueError:
        msg = '%r tag requires a single argument' % token.split_contents()[0]
        raise template.TemplateSyntaxError(msg)

    return getProductName(packageStr[1])

class getProductName(template.Node):
    def __init__(self, packageStr):
        self.packageStr= packageStr
    
    def render(self,context):
        packageDetail=template.resolve_variable(self.packageStr, context)
        productNameList = []
        
        products = product.objects.all()
        for productValue in products:
            if productValue.id in packageDetail:
                productNameList.append(productValue.name)

        productNameStr="<br/>".join(productNameList)            
        return productNameStr  

1. def getNames(parser,token):,paser는 템플릿 parser 대상입니다. 저는 사용하지 않았습니다.token은 전송된 값입니다.
2、token.split_contents () 는 빈칸에 따라 전송된 값을 분할하지만 인용부호 안의 값을 구분하지 않습니다.
3. class getProductName (template.Node): 출력 내용을 다시 정의하고render () 를 통해 실행하는 클래스입니다.
4、packageDetail=template.resolve_variable (self.packageStr,context) 은 전송된 값을 가져옵니다
5. 다음 코드는 대응하는name을 찾아내고 문자열로 되돌려주는 것입니다.
기능이 완성되었지만 일부 세부 사항을 이해하지 못했기 때문에 이것은 이후의 코드에서 계속 공부할 것이다.

좋은 웹페이지 즐겨찾기