django template for in for - django

Any idea why this doesn't work? It gives me an error at {% if tab.title==foc %}
{% for tab in menu %}
{% for foc in focus %}
<li>{{ tab.title }}</li>
{% if tab.title==foc %}
{% endif %}
{% endfor %}
{% endfor %}

Try it with spaces around ==
Alternatively, use the ifqual tag instead of if

The if statement was introduced on django 1.2 alpha and modified on django 1.2
The right way of using it:
{% if somevar == "x" %}
This appears if variable somevar equals the string "x"
{% endif %}
Check your django version at your django console with:
django.version
And if you using a lesser than 1.2 you should use the ifequal tag

Related

How to apply multiple if condition filter in djago template

I am rendering two filter from my views to html template. 1) notifications_approved 2)notifications_pending. I am using this two filter separately in my html. Is there any way to use this two filter together in if statement? here is my code:
#html template
{% for notification in notifications_approved %}
{% endif %}
{% for notification in notifications_pending %}
{%endif%}
I tried this but it's not rendering anything's in my template:
{%if notification in notifications_approved or notifications_pending %}
{%endif%}
I also tried this
{%if notification|notifications_approved or notification|notifications_pending %}
{%endif%} #getting TemplateSyntaxError
I also surprised very much why this if statement not working:
{% if notification in notifications_approved %}
{% endif %}
views.py
def ShowAuthorNOtifications(request):
notifications_approved = Notifications.objects.filter(notification_type="Comment Approved").order_by('-date')
notifications_pending = Notifications.objects.filter(notification_type="New Comment").order_by('-date')
{% if notification in notifications_approved %}
{% endif %}
If statement not working because we are not comparing anything. notifications_approved is a query set which contains list of objects. You need to loop it first. Secondly, if you need to check if the query set is empty or not, use:
{% with notifications_approved as np %}
{% if np %}
# your code
{% endif %}
{% endwith %}
OR
{% if notifications_approved or notifications_pending %}
OR
{% if notifications_approved.exists or notifications_pending.exists %}
OR
{% if notifications_approved.all or notifications_pending.all %}
You can use empty tag as well to check if empty:
{% for na in notifications_approved %}
# code
{% empty %}
# code for empty query set
{% endfor %}

If statement in my Django template...Is there a better way?

In my Django template: I'm trying to add an extra div around my for loop only if the length of the data being passed to the template is 3. This is what I'm trying right now but it seems like there could be better way than doing two if statements to check for the length:
{% if items|length == 3 %}
<div class='three-item-wrap'>
{% endif %}
{% for item in items %}
.......
{% endfor %}
{% if items|length == 3 %}
</div> //close .three-item-wrap
{% endif %}
you can try like that
{% if items|length == 3 %}
<div class='three-item-wrap'>
{% for item in items %}
.......
{% endfor %}
</div>
{% else %}
#another logic goes here
{% endif %}
if you want know more refer the docs django if tempalate
I think better way would be to make single if statement check. Just like this:
{% if items|length == 3 %}
<div class='three-item-wrap'>
{% for item in items %}
.......
{% endfor %}
</div>
{% else %}
{% for item in items %}
.......
{% endfor %}
{% endif %}
This way is better because of Django render engine, which firstly check if statements and then do for loop.
And if something crash in your code, div will be without closing tag </div>. Instead in my code there is no option for div to be without closing tag.

Django loop – remove last comma

I have the following loop set up, but need to remove the comma on the last item (it's to replicate a JSON array for cycle2)
{% for product_in_series in series.get_products %}{%spaceless%}
{% with product_in_series.product as product %}
{%if not forloop.first%}
"<img src='{% version product.get_overview 'page_image' %}'>",
{%endif%}
{% endwith %}
{%endspaceless%}{% endfor %}
Cheers,
R
What about this?
{% for product_in_series in series.get_products %}{%spaceless%}
{% with product_in_series.product as product %}
{%if not forloop.first%}
"<img src='{% version product.get_overview 'page_image' %}'>"
{%if not forloop.last%},{%endif%}
{%endif%}
{% endwith %}
{%endspaceless%}{% endfor %}
{{ forloop.last|yesno:",,"|safe }}
, - is a comma
None of the above works for me.
The correct syntax, as in Django 3.0, is as such
{% with querythisandthat as A %}
{% for u in A %} {{ u.interesting_stuff }}
{% if u == A.last %} . {% else %} ; {% endif %}
{% endfor %}
{% endwith %}
The reason is that A.last is not True/False, but it is the last element of the queryset
https://docs.djangoproject.com/en/3.0/ref/models/querysets/#django.db.models.query.QuerySet.first

Django template: check for empty query set

Is there a way to check for an empty query set in the Django template? In the example below, I only want the NOTES header to be displayed if there are notes.
If I put an {% empty %} inside the "for" then it does display whatever is inside the empty tag, so it knows it's empty.
I'm hoping for something that does not involve running the query twice.
{% if notes - want something here that works %}
NOTES:
{% for note in notes %}
{{note.text}}
{% endfor %}
{% endif %}
Clarification: the above example "if notes" does not work - it still displays the header even with an empty query set.
Here's a simplified version of the view
sql = "select * from app_notes, app_trips where"
notes = trip_notes.objects.raw(sql,(user_id,))
return render_to_response(template, {"notes":notes},context_instance=RequestContext(request))
Edit: the view select selects from multiple tables.
Have a look at the {% empty %} tag.
Example from the documentation
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% empty %}
<li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>
Link: https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#for-empty
If you are interested in a table, or some kind of heading if there are results, add the forloop.first:
{% for athlete in athlete_list %}
{% if forloop.first %}
Athlete Name:
{% endif %}
{{ athlete.name }}
{% empty %}
Sorry, no athletes in this list.
{% endfor %}
Try {% if notes.all %}. It works for me.
In your view check whether notes is empty or not. If it is then you pass None instead:
{"notes": None}
In your template you use {% if notes %} as normal.
It's unfortunate that you're stuck using a raw query set - they're missing a lot of useful behavior.
You could convert the raw query set into a list in the view:
notes_as_list = list(notes)
return render_to_response(template, {"notes":notes_as_list},context_instance=RequestContext(request))
Then check it as a boolean in the template:
{% if notes %}
Header
{% for note in notes %}
{{ note.text }}
{% endfor %}
{% endif %}
You could also make it happen without conversions using forloop.first:
{% for note in notes %}
{% if forloop.first %}
Header
{% endif %}
{{ note.text }}
{% endfor %}
What about:
{% if notes != None %}
{% if notes %}
NOTES:
{% for note in notes %}
{{ note.text }}
{% endfor %}
{% endif %}
{% else %}
NO NOTES AT ALL
{% endif %}
Your original solution
{% if notes %}
Header
{% for note in notes %}
{{ note.text }}
{% endfor %}
{% endif %}
Works now with Django 1.7 and thanks to QuerySet caching, it does not cost and extra query.
Often the right way to do this is to use the {% with ... %} tag. This caches the query so it runs only once and also gives you more flexibility with your markup than using {% empty %}.
{% with notes as my_notes %}
{% if my_notes %}
<ul>
{% for note in my_notes %}
<li>{{ note }}</li>
{% endfor %}
</ul>
{% else %}
<p>Sorry, no notes available</p>
{% endif %}
{% endwith %}
With this particular example I'm not sure how useful it is but if you're querying Many-to-Many field, for instance, it's likely what you want to do.
Use {% empty %} in django templates
{% if list_data %}
{% for data in list_data %}
{{ data.field_1 }}
{% endfor %}
{% else %}
<p>No data found!</p>
{% endif %}
We can write above code with {% empty %}.
{% for data in list_data %}
{{ data.field_1 }}
{% empty %}
<p>No data found!</p>
{% endfor %}

Am I using the django if template tag wrong?

I have this in my Django 1.2 template:
{% for m in model.related.iterator %}
{% if "str" or "Str" in m %}
{{m}}//I don't want anything here but put this in so I could see the output
{%else%}
{% if forloop.last %}
{% customtag "var" %}
{% endif %}
{% endif %}
{% endfor %}
I get the value of {{m}} no matter if it contains "str", "Str" or neither of them. Also, if I take out the or and compare one string it works but I would like to compare both without another else if. Any way to do that?
I believe what you want is
{% if "str" in m or "Str" in m %}
however, Glyn's answer would also work
try...
{% if "STR" in m|upper %}
Do something
{% endif %}