vsupalov

How to Pass Additional Context into a CBV?

Passing context into your templates from class-based views is easy once you know what to look out for.

There are two ways to do it - one involves get_context_data, the other is a bit less known, but can be pretty useful.

Are you trying to add keys to your context dict, but they are not working as expected? Here’s a quick checklist to see if you’re not missing something important:

  • Name the function responsible for context get_context_data
  • Get the context object using a super call
  • Take care that super suits your Python version (it makes a difference whether you use Python 2 or 3 – see the example below)
  • Set the field name to a reliable string-key (lower case letters and underscores is what I like to use)
  • Don’t forget to return your modified context object from the function

An example

Here is what the get_context_data function should look like:

def get_context_data(self, **kwargs):          
    context = super().get_context_data(**kwargs)                     
    new_context_entry = "here it goes"
    context["new_context_entry"] = new_context_entry
    return context

Above is the Python 3.x version. Please note, that if you’re using Python 2.x, your ‘super’ line has to look different:

def get_context_data(self, *args, **kwargs):          
    context = super(CBV_NAME, self).get_context_data(*args, **kwargs)
    new_context_entry = "here it goes"
    context["new_context_entry"] = new_context_entry
    return context

Be sure to replace CBV_NAME with the actual name of your CBV.

A second approach: quick context values

You can assign a value to extra_context from a function which is not get_context_data. Just modify the extra_context variable from inside a function of your CBV:

  self.extra_context["another_one"] = "here goes more"

This will be processed, to add the key to your context automagically.

Conclusion

Above, you have seen two ways to add a new key to the CBV context dictionary. If you’ve had an error, I hope that the checklist has helped you to trace it down.

Using those approaches, you should keep all previous context variables and be able to add new entries. I hope this helped you to avoid CBV trouble when creating a context to be passed to your Django templates. Happy coding!