Multiple arguments in Django template filters

Author: nme · Tuesday, 5 July, 2011 · No comments ·

By default, it is not currently possible to pass multiple arguments to Django template filter — documentation states: "Custom filters are just Python functions that take one or two arguments".

Here Idescribe solution that allows passing more arguments.

Lets say we have key and current query_string in our template context. We loop in paginator and alter query_string current key value with page. The key is to group arguments in an array. We use following custom filter:

@register.filter
def keys (first,second):
  if isinstance(first,list):
    return first+[second]
  else:
    return[first,second]

following filter allows us to:

{{"1"|keys:"2"|keys:"3"}}

which will return in our template:

[u'1', u'2', u'3']

Returning to described query_string altering problem — we use alter_query filter:

@register.filter
def alter_query (keys, query_string):
  from django.http importQueryDict
  query_dict =QueryDict(query_string,mutable=True)
  query_dict[keys[0]]= keys[1]
  return query_dict.urlencode()

inside pagination template, we use following code:

<ahref="?{{ key|keys:page|alter_query:query_string }}">{{ page }}</a>

Doesn't look pretty, but works perfectly.

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。