Index: django/template/__init__.py
===================================================================
--- django/template/__init__.py	(revision 6291)
+++ django/template/__init__.py	(working copy)
@@ -499,11 +499,18 @@
  (?:%(filter_sep)s
      (?P<filter_name>\w+)
          (?:%(arg_sep)s
+           (?P<args>
              (?:
-              %(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s|
-              "(?P<constant_arg>%(str)s)"|
-              (?P<var_arg>[%(var_chars)s]+)
+              %(i18n_open)s"%(str)s"%(i18n_close)s|
+              "%(str)s"|
+              [%(var_chars)s]+
              )
+             (?:
+              ,%(i18n_open)s"%(str)s"%(i18n_close)s|
+              ,"%(str)s"|
+              ,[%(var_chars)s]+
+             )*
+           )
          )?
  )""" % {
     'str': r"""[^"\\]*(?:\\.[^"\\]*)*""",
@@ -517,6 +524,19 @@
 filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "")
 filter_re = re.compile(filter_raw_string, re.UNICODE)
 
+arg_raw_string = r"""
+%(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s|
+"(?P<constant_arg>%(str)s)"|
+(?P<var_arg>[%(var_chars)s]+)""" % {
+    'str': r"""[^"\\]*(?:\\.[^"\\]*)*""",
+    'var_chars': "\w\." ,
+    'i18n_open' : re.escape("_("),
+    'i18n_close' : re.escape(")"),
+  }
+
+arg_raw_string = arg_raw_string.replace("\n", "").replace(" ", "")
+arg_re = re.compile(arg_raw_string, re.UNICODE)
+
 class FilterExpression(object):
     """
     Parses a variable token and its optional filters (all as a single string),
@@ -558,13 +578,16 @@
             else:
                 filter_name = match.group("filter_name")
                 args = []
-                constant_arg, i18n_arg, var_arg = match.group("constant_arg", "i18n_arg", "var_arg")
-                if i18n_arg:
-                    args.append((False, _(i18n_arg.replace(r'\"', '"'))))
-                elif constant_arg is not None:
-                    args.append((False, constant_arg.replace(r'\"', '"')))
-                elif var_arg:
-                    args.append((True, var_arg))
+                arg_group = match.group("args")
+                if arg_group:
+                    for arg_match in arg_re.finditer(arg_group):
+                        constant_arg, i18n_arg, var_arg = arg_match.group("constant_arg", "i18n_arg", "var_arg")
+                        if i18n_arg:
+                            args.append((False, _(i18n_arg.replace(r'\"', '"'))))
+                        elif constant_arg is not None:
+                            args.append((False, constant_arg.replace(r'\"', '"')))
+                        elif var_arg:
+                            args.append((True, var_arg))
                 filter_func = parser.find_filter(filter_name)
                 self.args_check(filter_name,filter_func, args)
                 filters.append( (filter_func,args))
Index: tests/regressiontests/templates/tests.py
===================================================================
--- tests/regressiontests/templates/tests.py	(revision 6291)
+++ tests/regressiontests/templates/tests.py	(working copy)
@@ -41,6 +41,11 @@
 
 register.tag("echo", do_echo)
 
+def multi_args(arg1, arg2, arg3):
+    return " ".join([arg1, arg2, arg3])
+
+register.filter("multi_args", multi_args)
+
 template.libraries['django.templatetags.testtags'] = register
 
 #####################################
@@ -272,6 +277,9 @@
             # Numbers as filter arguments should work
             'filter-syntax19': ('{{ var|truncatewords:1 }}', {"var": "hello world"}, "hello ..."),
 
+            # Filters can accept multiple arguments
+            'filter-syntax20': ('{% load testtags %}{{ var|multi_args:two,"three" }}', {"var": "one", "two": "see you"}, "one see you three"),
+
             ### COMMENT SYNTAX ########################################################
             'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"),
             'comment-syntax02': ("{# this is hidden #}hello{# foo #}", {}, "hello"),
