孟庆超

孟庆超的博客

他的个人主页  他的博客

Django中的万能标签

孟庆超  2010年04月23日 星期五 18:52 | 1975次浏览 | 5条评论

Django中使用的万能标签,用了这个大部分的标签都能转成view了

贴段得意的代码出来,用了这个基本上可以不写Django标签只写View了。

#coding=utf-8
'''
Created on 2009-9-4

@author: mengqc
'''
from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist
from django.template import resolve_variable
from django.template.context import Context

register = Library()

def import_func_from_str(model_str):
    components = model_str.split('.')
    model = components[-2]
    func = components[-1]
    models = '.'.join(components[:-1])
    m = __import__(models, globals(), locals(), [model], -1)
    return getattr(m, func)


class ExeNode(Node):
    def __init__(self, func, request, template, vargs):
        self.s_func = func
        self.s_request = request
        self.template = template
        self.s_vargs = vargs

    def render(self, context):
        func = import_func_from_str(resolve_variable(self.s_func, context))
        request = resolve_variable(self.s_request, context)
        template = resolve_variable(self.template, context)
        vargs = []
        for arg in self.s_vargs:
            vargs.append(resolve_variable(arg, context))
        return func(request, template, *vargs)
       

def do_exe(parser, token):
    '''
    这是一个允许在渲染时指定渲染函数和渲染模板的标签
   
    Usage::
   
    {% load lib_tags %}
    {% exe "example.views.exe_test" request "login/exe_test.html" ... %}
   
    标签至少需要三个参数,第一个参数为渲染函数的全质名,第二个参数为模板的request参数,第三个参数为模板文件路径,
    其余参数根据渲染函数定义的参数传入
   
    定义渲染函数,例如在example app中的.views.py文件中:
   
    def exe_test(request, template, ...):
        return render_to_response(template)
       
    函数至少需要两个参数,第一个参数为request,另外一个参数为模板,其余参数根据需要自己定义
   
    '''
    tokens = token.contents.split()
    if len(tokens) < 4:
        raise TemplateSyntaxError(u"'%r' tag requires at least 3 arguments." % tokens[0])
    return ExeNode(tokens[1], tokens[2], tokens[3], tokens[4:])

register.tag('exe', do_exe)


class ExternNode(Node):
    def __init__(self, nodelist, func, request, vargs):
        self.nodelist = nodelist
        self.s_func = func
        self.s_request = request
        self.s_vargs = vargs

    def render(self, context):
        func = import_func_from_str(resolve_variable(self.s_func, context))
        request = resolve_variable(self.s_request, context)
        vargs = []
        for arg in self.s_vargs:
            vargs.append(resolve_variable(arg, context))
           
        return self.nodelist.render(Context(func(request, *vargs)))

def do_extern(parser, token):
    """
    这是一个允许对模板的一部分采用不同函数进行单独渲染的标签
   
    Usage::
   
    {% load lib_tags %}
    {% extern "example.views.exe_test" request ... %}
    {{word}}
    {% endextern %}
   
    标签至少需要两个参数,第一个参数为渲染函数的全质名,第二个参数为模板的request参数,
    其余参数根据渲染函数定义的参数传入
   
    定义渲染函数,例如在example app中的.views.py文件中:
   
    def exe_test(request, ...):
        return {"word":"hello"}

    函数至少需要一个参数,参数为request,其余参数根据需要自己定义
   
    """
    nodelist = parser.parse(('endextern',))
    parser.delete_first_token()
    tokens = token.contents.split()
    if len(tokens) < 3:
        raise TemplateSyntaxError(u"'%r' tag requires at least 2 arguments." % tokens[0])
    return ExternNode(nodelist, tokens[1], tokens[2], tokens[3:])

register.tag('extern', do_extern)

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
peter

回复 peter  2010年04月29日 星期四 10:02

是我不思进取莫,,我觉得意义不大,,

0条回复

孟庆超

回复 孟庆超  2010年04月23日 星期五 22:35

能具体说说吗
环境,具体的操作?

0条回复

小包

回复 小包  2010年04月23日 星期五 20:43

安装 /home/Dszul/Download/Django-1.2-beta-1
error: invalid Python installation: unable to open /usr/lib/python2.6/config/Makefile (No such file or directory)

这个错误怎么解决??

2条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号