孟庆超 2010年04月23日 星期五 18:52 | 1975次浏览 | 5条评论
Djang
贴段得意的代码出来,用了这个基本上可以不写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 © 2024
京ICP备05028076号
回复 peter 2010年04月29日 星期四 10:02