文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Django实现自定义标签

Django实现自定义标签

时间:2009-08-24  来源:hkebao

1.要实现一个功能数据集里面的作循环然后将其中的一个值传到下一个当数据集的条件想了一下只能是考虑使用 自定义标签的办法了!

from django import template
from django.template import Context, Template, loader, resolve_variable

register = template.Library()

class PostDetailNode(template.Node):
    def __init__(self, id, current_post_id):
        self.id = id
        self.current_post_id = current_post_id        
        pass
    
    def render(self, context):       
        current_post_id = int(resolve_variable(self.current_post_id, context))        
        context['current_post_id'] = current_post_id
        t = loader.get_template("forum/templatetags/post_detail.html")        
        return t.render(context)

#在这里面我们可以再写一个模板页面进来的!这样的话就可以实现大循环里面的每一个子循环都将会自动加载进来 这个模板的!

#@register.tag(name='post_detail_tag')
def do_post_detail_tag(parser, token):
    try:
        #tag_name, args = token.contents.split(None, 1)
        #id, current_post_id = args.split(None, 1)
        tag_name, id, current_post_id = token.split_contents()
        print id, current_post_id
    except ValueError:        
        raise template.TemplateSyntaxError, "%s tag requires argument" % tag_name
    
    return PostDetailNode(id, current_post_id)

register.tag('post_detail_tag', do_post_detail_tag)

需要写一个django的自定义标签,需求很简单,根据标签里的token得到相应的model的queryset,放context里就行了。

Python代码
  1. {% load_model oa.Department  %}  
{% load_model oa.Department %}

我可以用{{ department }}得到oa.models 里的 Department所有的值,或者

Python代码
  1. {% load_model oa.Department  depart %}  
{% load_model oa.Department depart %}

用{{ depart }} 得到。

 

那么首先,我在某个已经安装的app里面的templates文件夹里新建一个文件loadModelTag.py。注意在templates里需要有__ini__.py。那么可以开始写程序了

 

Python代码
  1. #coding=utf-8  
  2. import sys  
  3. from django import template   
  4. from oa.models import *  
  5.   
  6. register = template.Library()   
  7.  
  8. @register.tag(name="load_model")  
  9. def do_load_model(parser,token):  
  10.     tokenNum = len(token.contents.split())    
  11.     name = None  
  12.     try:  
  13.         if tokenNum == 2:  
  14.            tag_name, path = token.split_contents()  
  15.         else:  
  16.            tag_name, path , name= token.split_contents()          
  17.     except ValueError:  
  18.         raise template.TemplateSyntaxError, \  
  19.             "%r tag TemplateSyntaxError" % token.contents.split()[0]  
  20.     mod_name,model_name=path.split('.')  
  21.     mod = sys.modules[mod_name]  
  22.     if model_name not in mod.models.__dict__:  
  23.         raise template.TemplateSyntaxError, "no model named %s"%model_name  
  24.     else:  
  25.         model = mod.models.__dict__[model_name]  
  26.     if name:  
  27.         model_name=name   
  28.     return load_moldelNode(model,model_name)  
  29.   
  30. class load_moldelNode(template.Node):  
  31.   
  32.     def __init__(self, model, model_name):  
  33.         self.model_name = model_name  
  34.         self.model = model  
  35.    
  36.     def render(self, context):  
  37.         context[self.model_name.lower()]=self.model.objects.all()  
#coding=utf-8 import sys from django import template from oa.models import * register = template.Library() @register.tag(name="load_model") def do_load_model(parser,token): tokenNum = len(token.contents.split()) name = None try: if tokenNum == 2: tag_name, path = token.split_contents() else: tag_name, path , name= token.split_contents() except ValueError: raise template.TemplateSyntaxError, \ "%r tag TemplateSyntaxError" % token.contents.split()[0] mod_name,model_name=path.split('.') mod = sys.modules[mod_name] if model_name not in mod.models.__dict__: raise template.TemplateSyntaxError, "no model named %s"%model_name else: model = mod.models.__dict__[model_name] if name: model_name=name return load_moldelNode(model,model_name) class load_moldelNode(template.Node): def __init__(self, model, model_name): self.model_name = model_name self.model = model   def render(self, context): context[self.model_name.lower()]=self.model.objects.all()

 

我们可以在模板中使用这个tag了,

首先要载入标签文件

{% load loadModelTag %}

然后就可以使用
{% load_model oa.Department %}
context中已经有department了

转自:http://vansention.javaeye.com/blog/362867

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载