Django pagination - for loop in all pages - python

I have a list of objects that I would like to display in an ul/li. For that I do the code below:
<ul id="myUL">
{% for l in lpps %}
<li id="lpps">{{ l.codeACL }} {{ l.libelle }}</li>
{% endfor %}
</ul>
The problem is that in my view, I ask to display only 15 objects per page.
But I want to ignore this and display all the objects on all the pages.
Is there something like for l in lpps.page(all)...?

django have forloop.counter ,
you can use that like
<ul id="myUL">
{% for l in lpps %}
{% if forloop.counter == 15 %}{% break %}{% endif %}
<li id="lpps">{{ l.codeACL }} {{ l.libelle }}</li>
{% endfor %}
</ul>

Related

Template rendering is wrong, category shows 2 times

So I am trying to render my models in a template but just one tiny thing shows more times than I expect. I just want category name to show one time for many lectures. I just cant figure where to modify the template code.
<ul>
{% for a in categories %}
{% for c in lectures %}
{% if a == c.course_category %}
<li><strong>{{ a.course_category }}</strong></li>
{% endif %}
{% if a == c.course_category %}
<li>{{ c.lecture_title }}</li>
<li>{{ c.content }}</li>
{% if c.link %}
<li>{{ c.link }}</li>
{% endif %}
{% if c.file %}
<li><a href='{{ MEDIA_URL }}{{ c.file.url }}'>download</a></li>
{% endif %}
{% endif %}
{% endfor %}
<hr/>
{% endfor %}
</ul>
You should move the {{ a.course_category }} out of the inner loop, so that you only display it once for each category.
{% for a in categories %}
<li><strong>{{ a.course_category }}</strong></li>
{% for c in lectures %}
<li>{{ lecture.lecture_title }}</li>
{% endfor %}
{% endfor %}
However, it's inefficient to loop through every lecture for every category. Depending on your models, you should be able to do something like:
{% for category in categories %}
<li><strong>{{ category.course_category }}</strong></li>
{% for lecture in category.lecture_set.all %}
<li>{{ lecture.lecture_title }}</li>
{% endfor %}
{% endfor %}
Or you might be able to loop through the lectures, and use the {% ifchanged %} tag to display the categories.
{% for lecture in lectures %}
{% ifchanged lecture.course_category %}
<li><strong>{{ lecture.course_category }}</strong></li>
{% endifchanged %}
<li>{{ lecture.lecture_title }}</li>
{% endfor %}

How turn {{ fieldset.fields }} in Django template into a string?

What does Django return with using {{ fieldset.fields }}? How can I make it a string?
In my template, I have this:
{% for fieldset in adminform %}
<li> {{ fieldset.fields }} </li>
{% if "nanoadded" in fieldset.fields %}
<li> nanoadded is here </li>
{% else %}
<li> nanoadded is NOT here </li>
{% endif %}
{% endfor %}
Here is what is returned:
[('arri', 'aconcentration', 'acat', 'anotes', 'agtlt', 'id'), ('nanoadded', 'response', 'select_charc')]
nanoadded is NOT here
So I am assuming that the fieldset.fields is not returning a string (even though it looks like a string). How can a make Django see the contents of fieldset.fields as a string? Thanks for you assistance!
It looks like the fields property returns a list that contains two tuples, so you might want to run it through a for loop to check each tuple for the membership of the string 'nanoadded'
Perhaps like this:
{% for fieldset in adminform %}
{% for field in fieldset.fields %}
<li> {{ field }} </li>
{% if "nanoadded" in field %}
<li> nanoadded is here </li>
{% else %}
<li> nanoadded is NOT here </li>
{% endif %}
{% endfor %}
{% endfor %}

Error in the template with Django : can I make arithmetic in if statement

I would like to make a pagination with Bootstrap : a new page every 10 new field in data.
file.html
{% for d in data %}
{% if forloop.first %}
<ul class="pagination">
{% endif %}
{% if (forloop.counter % 10) == 0 %}
<li>{{ forloop.counter % 10 }}</li>
{% endif %}
{% if forloop.last %}
</ul>
{% endif %}
{% endfor %}
output I would like that => Bootstrap pagination
But Django give me an error for this :
{% if (forloop.counter % 10) == 0 %}
TemplateSyntaxError :/
I don't know how to do except create my own filter or add a filter, but i would like to know first if i can do in the template first.
PS: I use Django 1.5 and I can't upgrade it.
Edit:
Finally I use this condition:
{% if forloop.counter|divisibleby:'10' and forloop.counter|divisibleby:'5' and forloop.counter|divisibleby:'2' %}
Like that I know when I have a 10 multiple.
The modulus (%) operator is not available in django templates. However, you can use the divisibleby (https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#divisibleby) template filter, something like
{% if forloop.counter|divisibleby:"2" %}
Use the paginator, your QuerySet are not evaluated for the hole table, just the number you need to build the page, and it offers properties that you can use in the template like (page_range, next_page_number, has_next, etc.)
here is the code withe BootStrap 2 and django.core.paginator:
<div class="pagination pagination-centered">
<ul>
{% if MYDATAENTIRES.has_previous %}
<li>
{% trans "Précédent" %}
</li>
{% endif %}
{% for i in MYDATAENTIRES.paginator.page_range %}
<li {% ifequal MYDATAENTIRES.number i %} {{ 'class="disabled"' }} {% endifequal %}>
<a href="?page={{ i }}">
{{ i }}
</a>
</li>
{% endfor %}
{% if MYDATAENTIRES.has_next %}
<li>
{% trans "Suivant" %}
</li>
{% endif %}
</ul>
</div>

django paginator - how to show all page numbers available

I have simple issue:
I have this {{ objects.paginator.num_pages }} in template, which gives me the total number of pages that contain items.
now i want to show those page numbers like this
1 | 2 | 3 | 4 | 5
to achieve this, i need to make forloop till the num_pages. like for i to num_pages.
how is it possible in django template? i am reading some snippets, but they are a bit difficult to understand for me.
Formatted with twitter bootstrap and with links:
<ul class="pagination nav navbar-nav">
{% if objects.has_previous %}
<li>Prev</li>
{% endif %}
{% for page in objects.paginator.page_range %}
<li class="{% if objects.number == page %}active{% endif %}">{{ page }}</li>
{% endfor %}
{% if objects.has_next %}
<li> Next</li>
{% endif %}
</ul>
You can use page_range
{% for page in objects.paginator.page_range %}
{% if forloop.counter != 1 %} | {% endif %}
{{ page }}
{% endfor %}

Django template remove sub list

Maybe a stupid question but how do I remove a sublist from list in django template
I have something like this:
{% for j in sub_com|slice:"1" %}
{% for k in j|slice:"3" %}
<li> {{k}} </li>
{% endfor %}
{# remove sublist from list here #}
{% endfor %}
You can probably use templateContext.pop here.
{% for j in sub_com|slice:"1" %}
{% for k in j|slice:"3" %}
<li> {{k}} </li>
{% endfor %}
{{ j.pop.0 }}
{% endfor %}

Categories