#17228 closed Cleanup/optimization (fixed)
params context variable from TemplateView is inconsistent with other get_context_data implementations
Reported by: | Preston Holmes | Owned by: | nobody |
---|---|---|---|
Component: | Generic views | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The general pattern of get_context_data is to return a context dictionary where the kwargs passed to the method are used to update the context.
This pattern is true for all classes that implement get_context_data except for TemplateView, which adds all the kwargs as a 'params' item.
This is as documented but is inconsistent and makes it trickier to finish up work on #16074 which requires that all implementations of get_context_data call super.
The cleanest design would be a pattern of:
def get_context_data(self, **kwargs): context = super(.... )(kwargs) # class specific stuff here return context
I propose that the use of a params item be deprecated, removed from the docs, and preserved through deprecation by both updating the context with kwargs, and defining the explicit 'params' item in TemplateView.
Change History (9)
comment:1 by , 13 years ago
Summary: | params context variable is from TemplateView is inconsistent with other get_context_data implementations → params context variable from TemplateView is inconsistent with other get_context_data implementations |
---|
comment:2 by , 13 years ago
comment:3 by , 13 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:4 by , 13 years ago
I have inadvertently essentially duplicated this issue in #17381 however there is a subtle difference.
My greater gripe is with taking all kwargs to get_context_data and stuffing it into the params context variable.
If the legacy behavior is to be supported, it would be better IMO to have the get method call self.get_context_data thusly:
context = self.get_context_data(params=kwargs)
instead of
context = self.get_context_data(**kwargs)
This would allow get_context_data to be called with other kwargs in a call chain from a subclass without all those kwargs getting sucked into the params context variable.
comment:6 by , 12 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
The reason for params is to allow easier migration from direct_to_template:
https://docs.djangoproject.com/en/dev/ref/generic-views/#django-views-generic-simple-direct-to-template
However, I still think that the pattern is deviant enough from the main CBV to warrant a deprecation, which won't completely kick in until a version after function based views are completely removed from Django.