docs: def update_GET(parser, token):
      """
      ``update_GET`` allows you to substitute parameters into the current request's
      GET parameters. This is useful for updating search filters, page numbers,
      without losing the current set.
  
      For example, the template fragment::
  
          <a href="?{% update_GET 'attr1' += value1 'attr2' -= value2
          'attr3' = value3 %}">foo</a>
  
      -  adds ``value1`` to (the list of values in) ``'attr1'``,
      -  removes ``value2`` from (the list of values in) ``'attr2'``,
      -  sets ``attr3`` to ``value3``.
      and returns a urlencoded GET string.
  
      Allowed attributes are:
  
      -  strings, in quotes
      -  vars that resolve to strings
  
      Allowed values are:
  
      -  strings, in quotes
      -  vars that resolve to strings
      -  lists of strings
      -  None (without quotes)
  
      Note:
  
      -  If a attribute is set to ``None`` or an empty list, the GET parameter is
         removed.
      -  If an attribute's value is an empty string, or ``[""]`` or ``None``, the value
         remains, but has a ``""`` value.
      -  If you try to ``=-`` a value from a list that doesn't contain that value,
         nothing happens.
      -  If you try to ``=-`` a value from a list where the value appears more
         than once, only the first value is removed.
      """
      try:
          args = token.split_contents()[1:]
          triples = list(_chunks(args, 3))
          if triples and len(triples[-1]) != 3:
              raise template.TemplateSyntaxError, "%r tag requires arguments in groups of three (op, attr, value)." % token.contents.split()[0]
          ops = set([t[1] for t in triples])
          if not ops <= set(['+=', '-=', '=']):
              raise template.TemplateSyntaxError, "The only allowed operators are '+=', '-=' and '='. You have used %s" % ", ".join(ops)
  
      except ValueError:
          return UpdateGetNode()
  
      return UpdateGetNode(triples)