为django写的一个source的tag

本文介绍如何在Django模板中使用自定义标签`source`插入方法返回的字符串到HTML页面,包括参数解析、方法导入及错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#coding=utf-8
from django import template

register = template.Library()

#register.tag('source', do_source)
@register.tag(name="source")
def do_source(parser, token):
    """
      source can direct insert method return string into html
      {% source myapp mymethod %}
      or
      {% source myapp mymethod arg0 arg1 arg2 %}
      or
      {% source myapp mymethod arg0,arg1,arg2 %}
    """
    try:
        # split_contents() knows not to split quoted strings.
        args = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires at least two arguments" % token.contents.split()[0])
    if len(args) < 2:
        raise template.TemplateSyntaxError("%r tag requires at least two arguments" % token.contents.split()[0])
    model_name = args[1]
    method_name = args[2]
    params = []
    if len(args) >=3:
        params += args[3:]
    if len(params) == 1:
        if ',' in params[0]:
            params = ['%s' % arg for arg in params[0].split(",")]
    # try to import this method
    try:
        models = __import__(model_name, fromlist = [method_name])
        method = getattr(models, method_name)
    except:
        raise template.TemplateSyntaxError("Can't import %s[%s]" % (model_name, method_name))

    return SourceNode(method, params)

class SourceNode(template.Node):
    def __init__(self, method, params):
        self.method  = method
        self.params  = params

    def render(self, context):
        try:
            value = self.method(context, (arg for arg in self.params))
        except:
            from django.conf import settings
            if settings.DEBUG:
                import sys,traceback
                str = '<p> [%s] [%s] </p>' % (self.method, self.params)
                str += '<p> [%s] </p>' % traceback.format_exception(*sys.exc_info())
                return str
            else:
                return str
        return value

 

转载于:https://www.cnblogs.com/eaglexmw/archive/2013/04/10/3012562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值