I'd like to bump this. While there might be better solutions, I think the
issue is not so wacky after all.
On Thursday, September 4, 2014 3:02:34 PM UTC+2, germano guerrini wrote:
>
> Hello everyone,
>
> while writing a test for a view, I found that one of the rendered
> templates context had a key used by the main template of the view itself,
> but with a different value.
> Given the rendering order, calling
>
> response.context[key]
>
> would not return the view template context value, but the included
> template one.
>
> Let me write some code to help myself explaining:
>
> def my_view(request):
> context = {'foo': 'bar'}
> template = 'my_template.html'
> return render_to_response(template, context)
>
>
> def test_my_view(self):
> url = reverse('url_pattern_name')
> response = self.client.get(url)
> self.assertEqual(response.context['foo'], 'bar') # Fails, due to
> another template rendered in my_template redefine 'foo'
>
>
> So I was wondering whether it might be useful to enrich the ContextList
> object by annotating somehow the template name for each sub context.
> The *store_rendered_templates* method in django/test/client.py seems the
> right place to do it, as it receives both the template and the context:
>
> def store_rendered_templates(store, signal, sender, template, context, **
> kwargs):
> """
> Stores templates and contexts that are rendered.
>
>
> The context is copied so that it is an accurate representation at the
> time
> of rendering.
> """
> store.setdefault('templates', []).append(template)
> store.setdefault('context', ContextList()).append({template.name: copy
> (context)})
>
> and of course the ContextList class has to be modified as well:
>
> class ContextList(list):
> """A wrapper that provides direct key access to context items
> contained
> in a list of context objects.
> """
> def __getitem__(self, key):
> if isinstance(key, six.string_types):
> for template_context in self:
> for subcontext in template_context.itervalues():
> if key in subcontext:
> return subcontext[key]
> raise KeyError(key)
> else:
> return super(ContextList, self).__getitem__(key)
>
>
> def __contains__(self, key):
> try:
> self[key]
> except KeyError:
> return False
> return True
>
>
> def keys(self):
> """
> Flattened keys of subcontexts.
> """
> keys = set()
> for template_context in self:
> for subcontext in template_context.itervalues():
> for dict in subcontext:
> keys |= set(dict.keys())
> return keys
>
>
> def get_for_template(self, template_name):
> # Cannot use self[template_name] because of __getitem__
> for template_context in self:
> if template_context.keys()[0] == template_name:
> return template_context.values()[0]
> raise KeyError
>
> The implementation is a bit cumbersome because ContextList should be a
> ContextDict instead, but that should do the trick nonetheless.
> What do you think about it?
>
> Thanks,
> Germano
>
>
>
--
You received this message because you are subscribed to the Google Groups
"Django developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-developers/25acf075-17b1-4596-9385-fa92fd2e618c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.