user49411
user49411

Reputation: 401

Parentheses in django if statement

How can I do this cleanly in a Django template? Basically if A, or (B and C) , I want to show some HTML.

I basically have this:

{% if user.is_admin or something.enable_thing and user.can_do_the_thing %}

Now, thats a bit ambigious. I tried doing

{% if user.is_admin or (something.enable_thing and user.can_do_thething) %}

But you arent allowed Parentheses. The docs say to use nested ifs (or elifs in this case, i guess, as its an OR) , but I dont want to repeat the same HTML inside 2 if blocks, which sounds horrible.

Upvotes: 32

Views: 19361

Answers (3)

Chris
Chris

Reputation: 1321

If you have the case like you said: A or (B and C), then Sven's answer would work appropriately because the and would automatically have higher precedence according to the documentation.

However, if you wish to do something like (A or B) and C, then you could instead create and use custom template filters.

NOTE: Filters can only take at most two arguments, so they will only be useful if say, for example, you are comparing multiple attributes from 1 or 2 objects.

Upvotes: 0

Sven
Sven

Reputation: 301

As Mihai Zamfir commented it should work as expected. As Django documentation mentions:

Use of both and and or clauses within the same tag is allowed, with and having higher precedence than or e.g.:

{% if athlete_list and coach_list or cheerleader_list %}

will be interpreted like:

if (athlete_list and coach_list) or cheerleader_list

https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#boolean-operators

Upvotes: 21

dm03514
dm03514

Reputation: 55962

you could do the check in your view and pass a flag to the context.

show_html = user.is_admin or (something.enable_thing and user.can_do_the_thing)
context['show_html'] = show_html

Then in your template you could check the flag

{% if show_html %}

Upvotes: 11

Related Questions