django自定义tag(custom tag)

source:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

 

如果想对一个值进行过滤,当然用的是filter

但是会有这样的逻辑:

当前页面有一个product对象和user对象,两个对象是多对多关系,所以会有一个关系表,我想以指定的逻辑去查询这个关系表的数据。

 

做法:

a   在views中实现指定的逻辑,直接render_to_response出来一些变量。

b   custom tag中实现指定的逻辑

 

其中b

http://djangobook.py3k.cn/2.0/chapter09/ 
中有说明。

 

这里说一特别的地方:

使用custom tag的时候,传入的option 都是普通的string,如果传入的是object,要这么做

 

class FormatTimeNode(template.Node):
    def __init__(self, date_to_be_formatted, format_string):
        self.date_to_be_formatted = template.Variable(date_to_be_formatted)
        self.format_string = format_string

    def render(self, context):
        try:
            actual_date = self.date_to_be_formatted.resolve(context)
             return actual_date.strftime(self.format_string)
        except template.VariableDoesNotExist:
             return  ''

 

 

 

这个django doc 上的说明代码,用到的是template.Variable(),和template.Variable().resolve(context)

其中,django源码中的Variable 类的说明有如下:

     r"""

    A template variable, resolvable against a given context. The variable may be
    a hard-coded string (if it begins and ends with single or double quote
    marks)::

        >>> c = {'article': {'section':u'News'}}
        >>> Variable('article.section').resolve(c)
        u'News'
        >>> Variable('article').resolve(c)
        {'section': u'News'}
        >>> class AClass: pass
        >>> c = AClass()
        >>> c.article = AClass()
        >>> c.article.section = u'News'

    (The example assumes VARIABLE_ATTRIBUTE_SEPARATOR is '.')
    
"""

 

其中要说明的是resolve方法。

应该我遇到一个问题,就是:context_instance=RequestContext(request)的时候,会有一个全局的User对象和AnonymousUser对象。

如果我以

{%customtag user%} 

那么resolve返回的是user对象

{%customtag user.email%} 

 resolve 返回的是user.email的值了!

 

OK,一切OK了。 

 

转载于:https://www.cnblogs.com/snowleung/archive/2012/04/24/2468250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值