On 28/02/17 15:24, Marten Kenbeek wrote:
What about adding a filter |definedthat returns True if a variable is defined, False otherwise? It may not solve any problems when it's left implicit, but at least it allows users the explicitly define the behaviour for non-existing template variables, and it makes the intention of the template code crystal clear. And of course it's fully backwards compatible. The drawback is perhaps the resulting verbosity of if statements:

{% if user.role|defined and roles.staff|defined and user.role == roles.staff %}
        [sensitive information here]
    {% endif %}

The only way to do it would be to hard code this filter into the template engine, because otherwise the 'defined' filter runs too late to know whether the variable is defined. This is really hacky and magic.

The alternative would be for this filter to take a string e.g.:

{% if "user.role"|defined and "roles.staff"|defined and user.role == roles.staff %}
        [sensitive information here]
    {% endif %}

As an analogy, in Python you can't write:

    if hasattr(foo.bar)

you have to write:

    if hasattr(foo, 'bar')

Another alternative would be to have some special syntax that could check for defined variables e.g.

   {% if user.role? and roles.staff? and user.role == roles.staff %}

My own preference, if I had a time machine, would be to have missing data/attributes just raise NameError/KeyError/AttributeError, and then have special syntax for replacing missing values with None - like https://msdn.microsoft.com/en-us/library/dn986595(v=vs.140).aspx .

However, I think that any option involving special syntax here has already got way too complex for the design philosophy of Django templates - to be simpler than normal Python code, and more designer friendly - this would take us in the opposite direction.


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

Reply via email to