需要从simple.tag制作模板标签

时间:2014-10-27 14:52:22

标签: python django django-templates

我有以下简单模板标记,它返回值列表。 我需要的是像模板标签一样重写它,所以我可以使用返回列表作为变量

@register.simple_tag
def show_active_filters(cleaned_filter):
  filter_list = []
  if cleaned_filter:
    if cleaned_filter['checkbox']:
        for key, value in cleaned_filter['checkbox'].items():
            for values in value:
                filter_list.append('%s: %s' % (key, values))
    if cleaned_filter['from_to']:
        for filter_name, filter_values in cleaned_filter['from_to'].items():
            sorted_values = sorted(filter_values.values())
            if len(sorted_values) < 2:
                try:
                    filter_values['from']
                    filter_str = u'%s :  от %s' % (filter_name, sorted_values[0])
                    filter_list.append(filter_str)
                except:
                    filter_str = u'%s :  до %s' % (filter_name, sorted_values[0])
                    filter_list.append(filter_str)
            else:
                filter_str = u'%s : от %s -  до %s' % (filter_name, sorted_values[0], sorted_values[1])
                filter_list.append(filter_str)
  return filter_list

我试图这样做的方式是

@register.tag(name='show_active_filters')
def do_show_active_filters(parser, token):
  error = False
  try:
    tag_name, cleaned_filter, _as, var_name = token.split_contents()
    if _as != 'as':
        error = True
  except:
    error = True

  if error:
    raise template.TemplateSyntaxError, 'invalid stuff"'
  else:
    return CleanedFilterDictionary(cleaned_filter, var_name)

class CleanedFilterDictionary(template.Node):
  def __init__(self, cleaned_filter, var_name='filter_vals'):
    self.cleaned_filter = cleaned_filter
    self.var_name = var_name

def render(self, context):
    context[self.var_name] = get_active_filters(cleaned_filter)
    return ''

def get_active_filters(cleaned_filter):
  filter_list = []
  if cleaned_filter:
    if cleaned_filter['checkbox']:
        for key, value in cleaned_filter['checkbox'].items():
            for values in value:
                filter_list.append('%s: %s' % (key, values))
    if cleaned_filter['from_to']:
        for filter_name, filter_values in cleaned_filter['from_to'].items():
            sorted_values = sorted(filter_values.values())
            if len(sorted_values) < 2:
                try:
                    filter_values['from']
                    filter_str = u'%s :  от %s' % (filter_name, sorted_values[0])
                    filter_list.append(filter_str)
                except:
                    filter_str = u'%s :  до %s' % (filter_name, sorted_values[0])
                    filter_list.append(filter_str)
            else:
                filter_str = u'%s : от %s -  до %s' % (filter_name, sorted_values[0], sorted_values[1])
                filter_list.append(filter_str)
  return filter_list

无法获取如何将cleaning_filter变量传递给类实例

1 个答案:

答案 0 :(得分:1)

您可以使用assignment_tag装饰器代替simple_tag - 原始代码的其余部分应该按原样运行。