Re: django 1.5 incompatibility at TemplateView

216 views
Skip to first unread message

Marc Tamlyn

unread,
Aug 19, 2012, 5:44:03 AM8/19/12
to django-d...@googlegroups.com
Hi Bernado,

Template view passing params into the context rather than just passing the kwargs from the urlconf directly is actally somewhat older, and is kept as legacy from django.views.generic.simple.direct_to_template. The changes you refer to do actually introduce a subtle backwards incompatibility with TemplateView - but yesterday we made a new commit[1], fixing the *real* problem, which is that the params variable was inconsistent with how the rest of the CBVs worked. This actually introduces a slightly different backwards incompatibility, which is that the params variable no longer exists. This has been documented in the release notes.

There is perhaps a case for removing this passing of urlconf kwargs to the context all together, as it seems a little odd to me and only applies to TemplateView, but for the moment it's at least been made a bit more consistent with how other CBVs work.

Marc

[1] https://github.com/django/django/commit/f04bb6d798b07aa5e7c1d99d700fa6ddc7d39e62

On Saturday, 18 August 2012 08:21:28 UTC+1, Bernardo wrote:
Hi, I was trying my project on django 1.5 alpha and a change on TemplateViews made some code break.
The `get` method changed how `get_context_data` is called from (**kwargs) to (params=kwargs). Link: https://github.com/django/django/blob/master/django/views/generic/base.py

I traced the change and found a ticket saying the TemplateView could not be used with FormView because the get_context_data is in a different layout. Ticket: https://code.djangoproject.com/ticket/16074

I don't know how popular are classed based views among other django developers, but I only use them. So, this change could be added in the release notes to warn people about breaking some code.
For me, I had the habit of writing:

With e.g. this url:   url(r'^ref/(?P<id>\d+?)/?$', views.ref.Show.as_view())

    def get_context_data(self, id, **kw):
        pass #do something with id

Now, the only way I find to keep the code compatible with both 1.4 and 1.5 is doing:

    def get_context_data(self, **kw):
        id = kw.get('params', kw)['id']

which is just a little bit more code but could crash in django 1.4 if somehow there's a "params" argument

Could this be avoided?

Thanks,
Bernardo

Bernardo

unread,
Aug 19, 2012, 3:44:11 PM8/19/12
to django-d...@googlegroups.com
So as long as I don't use the `params` thing (which I don't) there will be no problem with my views?
Reading this and the other commit done at the same time, looks like the function calls behave the way I expect :)

Bernardo

Marc Tamlyn

unread,
Aug 20, 2012, 2:53:54 AM8/20/12
to django-d...@googlegroups.com
Correct :)
Reply all
Reply to author
Forward
0 new messages