Opened 5 years ago

Last modified 4 years ago

#19878 new New feature

Stop TemplateView automatically passing kwargs into the context

Reported by: Alexey Boriskin Owned by: nobody
Component: Generic views Version: master
Severity: Normal Keywords: django-sprint
Cc: marc.tamlyn@…, mszamot@…, chris.jerdonek@… Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no


Only TemplateView pushes self.kwargs to the context. ListView does not, I yet have to check others.
This is inconsistency and, I think, it should be fixed.

Change History (17)

comment:1 Changed 5 years ago by Carl Meyer

Triage Stage: UnreviewedDesign decision needed
Type: BugNew feature

Setting this DDN pending comment from someone who uses class-based views. Seems like a new feature rather than a bug, in any case.

comment:2 Changed 5 years ago by Jonas Svensson <jonas.s.svensson@…>

Has patch: set
Keywords: django-sprint added
Resolution: fixed
Status: newclosed

The CBV:

  • BaseDetailView
  • ProcessFormView
  • BaseListView

Did not push the kwargs into the context

comment:3 Changed 5 years ago by Alexey Boriskin

Resolution: fixed
Status: closednew

The ticket is not fixed until patch in merged into the django. Please don't set status to closed until it's not closed.

comment:4 Changed 5 years ago by Aymeric Augustin

This can be backwards incompatible in keys in kwargs clash with keys in the output of get_context_data().

The current behavior might be for backwards compatibility with the now-removed function-based generic views. Maybe this was discussed on django-developers?

This would need docs (release notes + check if the CBV docs need to be updated), and tests.

comment:5 Changed 5 years ago by Aymeric Augustin

Needs documentation: set
Needs tests: set

comment:6 Changed 5 years ago by Marc Tamlyn

Cc: marc.tamlyn@… added

I am strongly the other way on this issue - I think the feature is wrong in TemplateView and should be deprecated.

For example, it means that it's hard to have context_object_name and slug_url_kwarg the same - whether you get the object or the slug would be rather arbitrary.

comment:7 Changed 5 years ago by Jacob

Resolution: wontfix
Status: newclosed

Agreed with mjtamlyn, so marking this wontfix.

comment:8 Changed 5 years ago by Marc Tamlyn

Jacob - what's your opinion on taking the deprecation the other way - this one-off behaviour of TemplateView has bitten me before. Personally I'd like the views to be consistently *without* this feature.

comment:9 Changed 4 years ago by Aymeric Augustin

Resolution: wontfix
Status: closednew

comment:10 Changed 4 years ago by Aymeric Augustin

Has patch: unset
Needs documentation: unset
Needs tests: unset
Triage Stage: Design decision neededAccepted

IIRC TemplateView works like this for backwards-compatibility with the (now defunct) function-based generic views.

It would make sense to normalize it now, assuming we can figure out a deprecation path.

comment:11 Changed 4 years ago by Marc Tamlyn

Summary: Not all class based views push self.kwargs to contextStop TemplateView automatically passing kwargs into the context

comment:12 Changed 4 years ago by Marcin Szamotulski <mszamot@…>

Cc: mszamot@… added

comment:13 Changed 4 years ago by Marc Tamlyn

Hmm, I know I'd done something at some point using these views which had bitten me, but I can't remember what it was. This is near impossible to deprecate nicely and probably shouldn't be that big a deal.

That said, it didn't exist before 1.5 in its current form - the way these arguments are used was (backwardsly incompatibly) changed then anyway. Personally I'd like to just remove it as it "feels wrong", but whether that is a good idea is another question.

History lesson

Django 1.2 had direct_to_template which would pass through URL kwargs as an object called params into the context
Django 1.3 & 1.4 continued this pattern in the new TemplateView
Django 1.5 changed TemplateView to place the arguments directly into the context (and deprecated direct_to_template)

My personal feeling is that using URLconf kwargs directly in a view is a bad pattern, but it is a historical Django pattern. This, and the ability to customise CBVs using the as_view() call, are the remaining parts of it.

comment:14 Changed 4 years ago by loic84

I ran into the same problem as @mjtamlyn with TemplateView; and I also think that having the URL kwargs directly in the context_data is an anti pattern.

The anti pattern added to the discrepancy between the different views is IMO a problem big enough to warrant a documented backward incompatible change.

I tried to think of a transparent deprecation cycle, but what I found was at best fragile and hackish.

One option would be to ask people to set a kwargs_to_context = False argument on their TemplatView to get the "new" behavior and therefore opt out from the DeprecationWarning.


comment:15 Changed 4 years ago by Tim Graham

I'm not much of a user of CBVs but that deprecation plan sounds like it would work.

comment:16 Changed 4 years ago by Chris Jerdonek

Note that there is a distinction between passing **kwargs to get_context_data() and having get_context_data() return **kwargs.

Personally, I would favor TemplateView continuing to pass **kwargs to get_context_data() even if its return value is changed by default not to include kwargs. This would keep overriding get_context_data() simple because you can simply access **kwargs in the method without having to decide between **kwargs and self.kwargs.

For consistency, I would like it if all generic views passed the full view's keyword arguments to get_context_data(). Some classes like ProcessFormView restrict what is passed to get_context_data(), which was surprising to me because then **kwargs for the method differs from self.kwargs. I just opened #21964 which is about this issue.

comment:17 Changed 4 years ago by Chris Jerdonek

Cc: chris.jerdonek@… added
Note: See TracTickets for help on using tickets.
Back to Top