On 13/03/2018 4:55 PM, Craig de Stigter wrote:
Cheers Mike

That deprecation notice says to me that Context itself is not deprecated, but the `current_app` argument is. I don't think that's a problem for us as I don't think we've ever used it.

Perhaps I can clarify. As far as I can tell, according to the errors and deprecation warnings I'm receiving in Django 1.9:

  * `django.templates.base.Template.render()` requires a Context
    and does not accept a dict
  * `django.templates.backends.django.Template.render()` /requires a
    /and does not accept//a Context instance.

It is all news to me so I went looking. If you look at django/template/__init__.py there seems to be a brief explanation. It does start by saying the Django template namespace contains two independent subsystems. One is for pluggable (and the Django template language is pluggable) template backends. That's probably where the Jinja template system plugs in. The other subsytem is the Django template language itself.

I think the answer to your problem might be found in the imports in that __init__.py

If you are *only* using the Django template system that enormous codebase probably needs to be adjusted so it does all its template-oriented imports from that file. In other words ...

from django.template import Template, Context, RequestContext and whatever else you use.

Again, if you are only using Django templates you should be able to safely drop imports from 'backend' in favour of the above 'from django.template import ...'

Hope that works! Don't know of course but I reckon it would be worth a try.

Good luck


While I haven't yet made things 'work' in 1.10 to a point where I can test it adequately, the 1.10 code I've read looks consistent with that hypothesis.

So it really seems there's no clear safe choice, except to absolutely enforce that all templates in my codebase must be one or the other (presumably, the new-style one).

Unfortunately it's really unclear which of the two template classes I'm using in the hundreds of places we render templates in this rather large codebase. The shortcut functions (`render` etc) appear to use the backend-specific template, whereas if I just import Template directly and instantiate it it turns out to be the old-style template.

I'm not really sure what I'm saying except that maybe the old-style Template class just needs to be removed to avoid confusion.

On Tue, 13 Mar 2018 at 14:50 Mike Dewhirst <mi...@dewhirst.com.au <mailto:mi...@dewhirst.com.au>> wrote:

    On 13/03/2018 11:44 AM, Craig de Stigter wrote:
    Thanks for the reply.

    So I guess there are actually now two types of templates, and
    they have incompatible API. Neither is deprecated.


    I don't think your guess is correct. Or at least I'm missing
    something if it is!

    I remember bringing a project from 1.8 to 1.11 without any
    problems other my own mis-readings of the docs. Things changed in
    1.9 and the following comes from ...
    Notice the Deprecated comment  ...

        Rendering a context¶

    Once you have a compiled |Template|
    object, you can render a context with it. You can reuse the same
    template to render it several times with different contexts.

    /class /|Context|(/dict_=None/,

        This class lives at |django.template.Context|. The constructor
        takes two optional arguments:


            A dictionary mapping variable names to variable values.


            The name of the current application. This application name
            is used to help resolve namespaced URLs
            If you’re not using namespaced URLs, you can ignore this

            Deprecated since version 1.8: The |current_app| argument
            is deprecated. If you need it, you must now use a
            instead of a |Context|

    If you visit the link you quoted (below) and adjust the version
    part of it and travel back in time you can see there is no change
    until you get back to 1.9 from which I copied the above section.



    Has this confused anyone else? Is this a desirable/necessary

    I think in order to have consistent template usage in our project
    we really need to just use the new-style templates, which means
    we have to avoid using `django.template.Template` at all. Perhaps
    it could be deprecated and removed?

    Craig de Stigter

    On Monday, 12 March 2018 11:21:41 UTC+13, Daniel Roseman wrote:

        On Sunday, 11 March 2018 21:06:51 UTC, Craig de Stigter wrote:

            Hi folks

            I'm upgrading a large app from 1.8 to 1.11 and coming up
            against this as I traverse through django 1.9:

            >>> from django.template import engines, Context
            ... t = engines['django'].from_string('')
            ... t.render(Context({}))
            RemovedInDjango110Warning: render() must be called with a
            dict, not a Context.

            This is a surprising warning to me, since the docs still
            document the use of Template.render(Context) in 2.0:

            Would someone mind explaining this?

            Craig de Stigter

        Not the same thing. `t` here is an instance
        of django.template.backends.django.Template, whose render
        method takes a dict. If you did:

          from django.templates import Template
          t = Template('')

        then you would have an instance
        of django.template.base.Template, whose render method takes a

        I have no idea why the distinction, though.
-- DR.

-- You received this message because you are subscribed to the
    Google Groups "Django users" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to django-users+unsubscr...@googlegroups.com

    To post to this group, send email to
    django-users@googlegroups.com <mailto:django-users@googlegroups.com>.
    Visit this group at https://groups.google.com/group/django-users.
    To view this discussion on the web visit
    For more options, visit https://groups.google.com/d/optout.

You received this message because you are subscribed to the Google Groups "Django 
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
For more options, visit https://groups.google.com/d/optout.

Reply via email to