args and kwargs in django views

*args and **kwargs are used to pass a variable number of arguments to a function. Single asterisk is used for non-keyworded arguments and double for keyworded argument.

For example:

    def any_funtion(*args, **kwargs):
         //some code

    any_function(1,arg1="hey",arg2="bro")

In this, the first one is a simple (non-keyworded) argument and the other two are keyworded arguments;


The problem is that locals() returns a dictionary. If you want to use **kwargs you will need to unpack locals:

response = someview(request,**locals())

When you use it like response = someview(request,locals()) you are in fact passing a dictionary as an argument:

response = someview(request, {'a': 1, 'b': 2, ..})

But when you use **locals() you are using it like this:

response = someview(request, a=1, b=2, ..})

You might want to take a look at Unpacking Argument Lists


If it's keyword arguments you want to pass into your view, the proper syntax is:

def view(request, *args, **kwargs):
    pass

my_kwargs = dict(
    hello='world',
    star='wars'
)

response = view(request, **my_kwargs)

thus, if locals() are keyword arguments, you pass in **locals(). I personally wouldn't use something implicit like locals()